簡體   English   中英

python導入的子文件夾名稱相同

[英]Same sub-folder names for python imports

  • 我正在處理日常工作的python腳本集合。
  • 為了避免重復,我們想利用導入來共享一些工具。
  • 為了保持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")
  • PYTHONPATH設置為root folder
  • 當我嘗試執行“ python sub / hello_user.py”時,出現錯誤“ ImportError:沒有名為hello的模塊”。 如果將sub / lib重命名為sub / lib_hide,則會得到預期的輸出“ Hello”。
  • 我如何讓python從root / lib而不是root / sub / lib導入?
  • 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.pyroot/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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM