[英]Python Dynamic Import Can't Find Packages in Virtualenv
所以,我有一個目錄結構:
main.py
\_ modules/
\_ a.py
\_ b.py
在main.py中,模塊會在運行時動態加載,具體取決於指定的模塊。 (這允許添加假設的c.py
,重新運行main.py
,以及用於檢測c.py
並運行它的程序。)
問題是b.py
導入了通過pip安裝的模塊(在virtualenv中)。 (我要提到它作為一個庫,以避免混淆。)當b.py
被直接運行( python b.py
)庫進口就好了。 打開外殼並手動導入庫后,它就可以工作了。
但是,當main.py
運行和b.py
動態導入(使用pkgutil.iter_modules
檢測模塊,然后importlib.import_module
導入需要的),該庫b.py
進口未發現-一個ImportError: No module
未引發ImportError: No module
。
回顧一下:一個模塊會導入一個已安裝的庫,當直接運行該模塊或在python解釋器中手動導入有問題的庫時,此方法有效,但是當動態導入模塊時,找不到該庫。 是什么賦予了?
第三個不相關的細節是問題:pyenv。
有一個bug報告在這里 ,但長話短說是pyenv使用墊片來正確地攔截包裝的產品進口,並將它們路由。
這意味着pyenv必須混淆路徑。 當我直接運行python時,墊片在python路徑中顯而易見:
[dnelson@blueharvest somedir]$ python
Python 2.7 (r27:82500, Jun 1 2015, 15:01:57)
[GCC 4.9.2 20150212 (Red Hat 4.9.2-6)] on linux3
Type "help", "copyright", "credits" or "license" for more information.
>>> import site
>>> site.getsitepackages()
['/home/dnelson/.pyenv/versions/2.7/lib/python2.7/site-packages', '/home/dnelson/.pyenv/versions/2.7/lib/site-python']
>>> site.PREFIXES
['/home/dnelson/.pyenv/versions/2.7', '/home/dnelson/.pyenv/versions/2.7']
>>>
但是,在動態導入的程序包中,相同的代碼將導致以下輸出:
['/usr/lib64/python2.7/site-packages', '/usr/lib/python2.7/site-packages', '/usr/lib/site-python']
['/usr', '/usr']
因此,問題似乎在於pyenv在動態導入期間沒有發揮其勻稱魔術的作用。
為了解決該問題,我使用pip install --user
強制將pip安裝到動態導入所在的位置,而不是pyenv希望安裝的位置。 (如果您之前已經安裝了該軟件包以強制重新安裝,則還要添加-I
)
也可以通過使用sys.path.append
將安裝位置(在我的情況下為/usr/lib/python2.7/site-packages
)附加到python路徑中來解決,但這聞起來很糟,可能會導致問題對於其他人。
虛擬環境是臭名昭著的。 他們無數次地在小路旁亂轉,弄亂了很多東西。
在兩種情況下,您都需要檢查b.py
中的PATH
變量。 這很可能會不一樣。
您需要設置路徑以包含c.py
的目錄。 您可以在main.py
檢查PATH,如果那里是正確的,則意味着其他導入之一正在更改sys.path
從而將其刪除。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.