簡體   English   中英

如何從本地目錄而不是 pip 安裝的庫導入模塊?

[英]How to import a module from local directory rather than pip-installed library?

我已經將一個 python 庫xyz克隆到我的電腦中。 文件結構如下:

>> project (folder)
    * main.py
    >> xyz_git (folder)
          >> xyz (folder)

在主main.py

import sys
sys.path.insert(0, './xyz_git')
from xyz import Xyz

instance = Xyz()
print(instance.some_function())

問題是我也有 pip 安裝的模塊xyz到默認 python。 即使我刪除了本地文件夾,由於默認的 pip 安裝, from xyz import Xyz仍然可以工作。 如何確保xyz導入不是來自本地目錄,它會出錯?

如果您知道本地目錄的路徑,請在嘗試導入之前將其插入數組 sys.path 的第一個位置。

例如

import sys
mypath = "ABS_PATH_TO_PROJECT_ROOT_DIR"
sys.path.insert(0, mypath)
from module import var

如果您正在使用 git,您可能還需要考慮將其添加為 git子模塊

這並不干凈,但我能想到的唯一方法是檢查您的本地 xyz 中是否存在某些您知道不在已安裝 xyz 中的屬性。 請參閱以下示例:

主文件

import sys
sys.path.insert(0, './xyz_git')
import xyz
try:
    xyz.foo
except AttributeError as e:
    raise AttributeError('Local module xyz not installed!')

執行此操作的最佳方法是在開發模式下安裝該軟件包,因為該問題的公認答案已提及。

所以在這個問題的背景下:

$ cd ~/xyz_git/
$ pip install -e .

將在 pip 中重新加載包,以便 pip 引用本地包。 要強制您可以檢查 pip 中的路徑:

import xyz
correctLocation = "ABS_PATH_TO_PROJECT_ROOT_DIR/xyz_git/"
assert correctLocation == os.path.abspath(xyz.__file__))

當然,“正確位置”需要匹配絕對導入路徑,但是如果您在開發模式下安裝了正確的正確位置,那應該沒問題。

如上所述,我還強烈建議使用虛擬環境來管理已安裝的軟件包。

$ virtualenv dev_env
$ source dev_env/bin/activate

在開發模式下安裝之前。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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