Python 如何检查virtualenv是否是使用“--无站点包”创建的?

Python 如何检查virtualenv是否是使用“--无站点包”创建的?,python,django,virtualenv,pip,virtualenvwrapper,Python,Django,Virtualenv,Pip,Virtualenvwrapper,有时我会发现一些错误,我怀疑这些错误是由于我的Django应用程序使用了全局安装的Python模块/Django应用程序,而不是其virtualenv中的那些 有没有一种方法可以检查我的应用程序的virtualenv是否是使用“-no site packages”创建的,而不必删除它,然后按如下方式重新创建它 deactivate rmvirtualenv my_env mkvirtualenv my_env --no-site-packages workon my_env pip instal

有时我会发现一些错误,我怀疑这些错误是由于我的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

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

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

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

当您使用-no-site-packages创建虚拟环境时,/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

@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
/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
如果您没有站点包,则所有路径如下:

/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
否则,您将得到如下结果:

for p in sys.path:
   if p.find("site-packages") >= 0:
     print p
/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

只有在两个位置安装了相同的模块时,此选项才有效。除非更改pythonpath,否则无法同时导入这两个组件。如果不更改pythonpath,您将获得一个ImportError-取决于您从何处获得它,您知道它只安装在位置X。如果在站点包中安装了模块,则为True。但是,你必须选择一个你知道它在那里的模块,事实上,检查ImportErrorIt就是一个例子。此外,即使virtualenv处于活动状态,也始终指向python的lib文件夹。