所以,我有一个目录结构:
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
抛出。
回顾一下:一个模块会导入一个已安装的库,当直接运行该模块或在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
如果您以前已经安装了该软件包以强制重新安装,则还要添加一个)
也可以通过使用,将安装位置(在我的情况下/usr/lib/python2.7/site-packages
)附加到python路径来解决sys.path.append
,但这听起来很糟糕,并且可能给其他人带来麻烦。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句