2017-08-11 60 views
0

嘿,我的工作,因爲它有一組層級模塊,建立像這樣的文件夾結構的項目:進口複雜的文件夾層次

module_name/ 
    __init__.py 
    constants.py 
    utils.py 
    class_that_all_submodules_need_access_to.py 

    sub_module_a/ 
     __init__.py 
     sub_module_a_class_a.py 
     sub_module_a_class_b.py 
     useful_for_sub_module_a/ 
      __init__.py 
      useful_class_a.py 
      useful_class_b.py 

    sub_module_b/ 
     __init__.py 
     sub_module_b_class_a.py 
     sub_module_b_class_b.py 

等等等等......

問題是,我無法弄清楚如何在init .py中設置導入,以便我可以從sub_module_a/useful_for_sub_module_a/useful_class_a.py訪問class_that_all_submodules_need_access_to.py。

我試過在谷歌/ StackOverflow上查找這個用盡,我已經提出了。特別的是,PyCharm的路徑設置方式使我在PyCharm中的項目中工作時沒有遇到這個錯誤,但只能從其他環境中處理。

所以這裏是我提出的一個特別不雅的解決方案。我sub_module_a/useful_for_sub_module_a/初始化的.py的樣子:

import sys 
import os 

sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..', '..'))) 

import module_name 

這是sub_module類似_ * /,而不是在那裏的3」 ..的這短短兩年(即'.. '' .. '而不是'..','..','..'爲上面的sys.path.insert行)。然後在sub_module_a/useful_for_sub_module_a/useful_class_a.py,我不得不進口MODULE_NAME/constants.py(和其他人)是這樣的:

import module_name.constants 
from module_name.class_that_all_submodules_need_access_to import ImportantClass 

雖然這種解決方案的工作,我想知道是否有更好的/更優雅的方式來設置導入和/或文件夾層次結構?我很擔心與此模塊的用戶的python系統路徑有關。這甚至是一個有效的關注嗎?

回答

0

有兩種Python導入:絕對和相對,請參閱Python import。但第一個重要的是你需要了解python如何找到你的包?如果你只是把你的軟件包放在你的home文件夾下,那麼Python對它一無所知。你可以查看這個博客[Python搜索](https://leemendelowitz.github.io/blog/how-does-python-find-packages.html)。

因此要導入模塊,首先要讓Python知道你的包。知道Python將搜索包的位置後,通常有兩種方法可以實現此目標:

(1)PYTHONPATH環境變量。在你的環境配置文件中設置這個變量,例如.bash_profile。這也是最簡單的方法。

(2)使用setuptools,它可以幫助您分發包。這是一個漫長的故事。我不建議你選擇它,除非你想在將來分發你的軟件包。但是,值得了解它。

如果你正確設置你的路徑,Python導入就直截了當。如果您想使用絕對進口,儘量

from module_name import class_that_all_submodules_need_access_to 

如果你想使用相對進口,這取決於你現在哪個模塊。假設你正在寫的模塊module_name.sub_module_a.sub_moduel_a_class_a,然後嘗試

from .class_that_all_submodules_need_access_to import XX_you_want 

請注意,相對進口僅支持from .xx import xx格式。

謝謝。

+0

也只是複製到網站包文件夾是一個解決方案:) –