簡體   English   中英

Python動態導入在Virtualenv中找不到包

[英]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.

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