为什么sys.path
包含/usr/...
在我的 virtualenv 的目录之前?
我用以下命令创建 virtualenv--system-site-packages
The sys.path
目前看起来像这样:
/home/my-virtualenv/src/foo
/usr/lib/python2.7/site-packages <--- /usr paths should be below
/usr/lib64/python2.7/site-packages
/home/my-virtualenv/lib/python27.zip
/home/my-virtualenv/lib64/python2.7
/home/my-virtualenv/lib64/python2.7/plat-linux2
/home/my-virtualenv/lib64/python2.7/lib-tk
/home/my-virtualenv/lib64/python2.7/lib-old
/home/my-virtualenv/lib64/python2.7/lib-dynload
/usr/lib64/python2.7
/usr/lib/python2.7
/usr/lib64/python2.7/lib-tk
/home/my-virtualenv/lib/python2.7/site-packages
我想要我的 virtualenv 之外的所有路径(/usr...
)位于 virtualenv 的路径下方。
否则会发生疯狂的事情:我用 pip 安装一个包。 Pip 告诉我新版本已安装(pip freeze | grep -i ...
)但导入确实使用了来自/usr/lib/python2.7/site-packages
我不能使用--no-site-packages
在我的背景下。
有没有办法排序sys.path
?
为什么我使用系统站点包
似乎没有直接的方法可以使全局站点包中的单个库在 virtualenv 中可用。看这个问题:使全局站点包中的一些模块在 virtualenv 中可用 https://stackoverflow.com/questions/19228198/make-some-modules-from-global-site-packages-available-in-virtualenv
有些软件包(例如 python-gtk)很难安装在 virtualenv 中。
讨论后编辑:
“我希望 virtualenv (/usr...) 之外的所有路径都低于
virtualenv 的路径。 [...] 需要对其进行排序。”
然后,只需对您的sys.path
在第一次导入发生之前。给定一定的路径prefix
对应于您的 virtalenv 的位置,这种方法可能就足够了:
sys.path = sorted(sys.path, key=lambda x: x.startswith(prefix), reverse=True)
sorted()
的排序行为是稳定的:具有相同排序键的项目保留原始顺序。这里,仅使用两个排序键:True
and False
。你需要想出一个可靠的方法来设置你的prefix
(您可能想要对其进行硬编码,或者根据当前工作目录确定它,我相信您会找到一种方法)。
原始答案(一般来说仍然有效):
您不想过多地阐述您的需求和应用场景,因此我提供了一个更笼统的答案:您可能需要过度思考您的方法,并且也许不期望virtualenv
彻底解决您的问题。
在某些情况下,virtualenv
只是不是完美的解决方案。它is一种妥协,本文详尽地描述了这种妥协的一方面:https://pythonrants.wordpress.com/2013/12/06/why-i-hate-virtualenv-and-pip/ https://pythonrants.wordpress.com/2013/12/06/why-i-hate-virtualenv-and-pip/
在很多场景下virtualenv
服务于一个伟大的目的并且做得非常好!当然,它对我帮助很大,尤其是出于开发目的。在其他场景中,它要么不是一个完整的解决方案,甚至是一个糟糕的解决方案。
所以,现在我看到有一些不同的选择:
- 使用 virtualenv,但控制那些需要更改的内容。例如修改
sys.path
从您的包裹中before进行一定的导入。虽然有些人可能认为这“不干净”,但它确实是一种有效且可靠地控制目录搜索顺序的非常快速的方法。sys.path.insert(1, foo)
实际上是由many包和测试环境。这一点也不罕见。这种方法只需一分钟的工作就可以为您提供一个可行的解决方案。试一试!
- 如果您认为您的案例中的 virtualenv 的行为与记录的不符或明显显示出错误行为,那么请将您的发现报告给项目。他们一定会感谢您简洁的反馈。
- 如果您认为 virtualenv 无法提供您的应用程序案例所需的隔离或控制级别,您可能需要考虑其他选项,例如 Docker 或 Vagrant,或全功能虚拟机。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)