如何检查是否使用“--no-site-packages”创建了virtualenv?

19

有时我会得到错误,我怀疑这是因为我的Django应用程序使用全局安装的Python模块/Django应用程序而不是其中的虚拟环境。

是否有一种方法可以检查我的应用程序的虚拟环境是否是使用'--no-site-packages'创建的,而无需删除它,然后按以下方式重新创建它?

deactivate
rmvirtualenv my_env
mkvirtualenv my_env --no-site-packages
workon my_env
pip install -r requirements.txt

肯定有更好的办法!谢谢。

3个回答

23

在创建带有 --no-site-packages 标志的虚拟环境时,<env>/lib/pythonX.X/ 目录下会有一个名为 no-global-site-packages.txt 的文件。

我刚试过了 virtualenv 1.7:

% virtualenv --no-site-packages env.without
% virtualenv --system-site-packages env.with

% find env.without | sed 's/env.without//' > files.without
% find env.with | sed 's/env.with//' > files.with

% diff files.with*
230a231
> /lib/python3.2/no-global-site-packages.txt

6

一种简单的方法是打开交互式Python shell并执行import somemodule; print somemodule,然后检查导入该模块的路径。

>>> import flask; print flask
<module 'flask' from '/home/xxx/dev/xxx/env/lib/python2.7/site-packages/flask/__init__.pyc'>

对比。

>>> import flask; print flask
<module 'flask' from '/usr/lib64/python2.7/site-packages/flask/__init__.pyc'>

只有在两个位置都安装了相同的模块时,这才是有效的。你不能真的尝试同时导入两个模块(除非你改变了Python路径)。 - Laur Ivan
如果不是,你会得到一个“ImportError” - 根据你得到它的位置,你知道它只安装在X位置。 - ThiefMaster
如果您在site-packages中安装了模块,则返回True。但是,然后您必须选择一个您“知道”存在的模块,并实际检查ImportError - Laur Ivan
这只是一个例子。此外,即使虚拟环境处于活动状态,“__future__”始终指向Python的lib文件夹。 - ThiefMaster

3

@Rob的解决方案适用于较新版本,我已经查看了代码 :).

如果您使用旧版本(例如我的1.4.5),您可以检查Python路径。如果路径中有默认的“site-packages”目录(例如/usr/lib/python/site-packages),则您的虚拟环境是包含 site-packages创建的。

您可以从类似以下内容的内容中进行检查:

import sys
for p in sys.path:
   if p.find("site-packages") >= 0:
     print (p)

如果你使用了--no-site-packages,那么所有的路径都会是这样的:
/home/user/virtualenv/myenv/lib/python2.6/site-packages/distribute-0.6.10-py2.6.egg
/home/user/virtualenv/myenv/lib/python2.6/site-packages/pip-1.0.2-py2.6.egg
/home/user/virtualenv/myenv/lib/python2.6/site-packages

否则,你将会有类似这样的内容:
/home/user/virtualenv/myenv/lib/python2.6/site-packages/distribute-0.6.10-py2.6.egg
/home/user/virtualenv/myenv/lib/python2.6/site-packages/pip-1.0.2-py2.6.egg
/home/user/virtualenv/myenv/lib/python2.6/site-packages
/usr/local/lib/python2.6/site-packages

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接