18

有时我会收到我怀疑是我的 Django 应用程序使用全局安装的 Python 模块/Django 应用程序而不是其 virtualenv 中的错误的结果。

有没有办法检查我的应用程序的 virtualenv 是否是使用“--no-site-packages”创建的,而不必删除它,然后按如下方式重新创建它?

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

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

4

3 回答 3

23

<env>/lib/pythonX.X/no-global-site-packages.txt使用--no-site-packages.

刚刚用 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
于 2012-01-16T23:01:12.483 回答
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'>
于 2012-01-16T22:56:57.777 回答
3

@Rob 的解决方案对较新版本有效,我查看了代码:)。

如果你有一个旧的(比如我的 1.4.5),你可以检查 python 路径。如果路径中有默认的“site-packages”目录(例如/usr/lib/python/site-packages),那么您的virtualenv 是使用site-packages 创建的。

您可以通过以下方式进行检查:

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
于 2012-01-17T13:33:50.467 回答