如何检查虚拟环境是否使用'--no-site-packages'创建?

19 投票
3 回答
10456 浏览
提问于 2025-04-17 10:23

有时候,我会遇到一些错误,我怀疑是因为我的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 个回答

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
6

一个简单的方法是打开交互式的Python命令行,然后执行 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'>
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

撰写回答