Python动态导入无法在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抛出。

回顾一下:一个模块会导入一个已安装的库,当直接运行该模块或在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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类常见问题

E:无法找到软件包npm

来自分类Dev

安装的Python脚本无法导入软件包模块

来自分类Dev

Cabal配置无法在Cabal沙箱中找到已安装的软件包

来自分类Dev

木偶:无法找到软件包tomcat

来自分类Dev

在Bower中找到冲突软件包并找到要安装的正确软件包

来自分类Dev

无法在Bower软件包中找到打字稿外部模块

来自分类Dev

NuGet无法找到软件包的版本

来自分类Dev

无法在python中导入已安装的软件包

来自分类Dev

无法找到ntpd软件包

来自分类Dev

无法找到软件包python-pipsudo

来自分类Dev

无法找到软件包chntpw

来自分类Dev

使用foreach时无法从同一软件包中找到功能(Windows devel)

来自分类Dev

在pypi.org上找到导入特定软件包的Python软件包

来自分类Dev

无法导入已安装的软件包

来自分类Dev

无法找到软件包pkgconfig

来自分类Dev

无法在python中导入已安装的软件包

来自分类Dev

无法找到ntpd软件包

来自分类Dev

无法从jsqlparser库导入软件包

来自分类Dev

无法找到软件包python-pipsudo

来自分类Dev

安装的Python脚本无法导入软件包模块

来自分类Dev

无法在Docker中找到软件包libc6-dbg:i386

来自分类Dev

无法在virtualenv内安装软件包

来自分类Dev

无法找到软件包python-pandas

来自分类Dev

E:无法在17.04中找到超扁平主题的软件包(来自noobslab PPA)

来自分类Dev

无法在第三方存储库中找到软件包

来自分类Dev

Python无法找到没有安装Anaconda的软件包

来自分类Dev

无法在LXD容器中找到qt5-default软件包

来自分类Dev

无法在Kali Linux中找到软件包whatsie

来自分类Dev

E: 无法在 ubuntu 18.04 中找到软件包 libvpx3