[英]Same sub-folder names for python imports
repository maintainable
,我們有一些子文件夾來收集用於特定目的的腳本,並在每個子文件lib-folder
中都有一個lib-folder
夾來保持共享功能。 結構看起來像這樣。
root
├── lib
│ ├── hello.py
└── sub
├── hello_user.py
└── lib
__init__.py files exist, but are filtered for better readability
hello_user.py中的代碼是這樣的:
from lib.hello import hello
hello()
並在hello.py中:
def hello():
print("Hello")
root folder
。 PYTHONPATH to "root/.."
設置PYTHONPATH to "root/.."
並importing "root.lib"
是可行的,但可能不是一個可行的選擇(將要求使用腳本和所有現有腳本在所有設置中進行更改)。 import statement
的解決方案。 相對路徑會很好,但是如何命名父文件夾的relative path
? “ ..”。 lib.hello無法正常工作。 如果使用python sub/hello_user.py
執行腳本,則目錄sub
將作為第一個元素自動添加到sys.path
中。 因此,無論PYTHONPATH
指向何處,都將在root/lib
之前找到root/sub/lib
並將其隱藏。 更改此設置的唯一方法是確保root
在路徑中出現在root/sub
之前:
sys.path.insert(0, '.../root')
如果導入模塊(或使用python -m sub.hello_user
直接執行模塊),情況將有所不同。
在python2中,導入被隱式視為相對,因此它將嘗試導入root/sub/lib/hello.py
, root/lib
再次被root/sub/lib
root/sub/lib/hello.py
。
Python3通過默認情況下將導入設置為絕對值來解決此問題,因此它將導入root/lib/hello.py
。 通過from __future__ import absolute_import
添加from __future__ import absolute_import
可以在python2中獲得此行為:
# root/sub/hello_user.py:
from __future__ import absolute_import
from lib import hello # imports root/lib/hello.py
from sub.lib import hello # imports root/sub/lib/hello.py
from .lib import hello # same, but relative import instead of absolute
但是,這僅在sub
不在root
之前的路徑中仍然有效。
您應該嘗試將roor / lib文件夾插入sys.path:
import sys
sys.path.insert(1, 'complete/path/root/lib')
sys.path是一個“字符串列表,用於指定模塊的搜索路徑。從環境變量PYTHONPATH初始化,加上與安裝有關的默認值”(來自http://docs.python.org/2/library/sys.html ?highlight = sys.path#sys.path )。
兩條評論:建議保持sys.path [0]不變(因此為1),因為第一個(0)是當前文件夾是預期的行為。 其次,有sys.path.append它將所需的路徑添加到sys.path的末尾 (不是您想要的)。
還有一個可能有用的imp lib ray( http://docs.python.org/2/library/imp )。
希望能有所幫助,P
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.