virtualenv没有使用自己的包

4 投票
2 回答
2922 浏览
提问于 2025-04-16 19:22

我开始在我的项目中使用virtualenvvirtualenvwrapper

在用workon命令激活虚拟环境后,我用pip install -U <package>安装了以下包:

$ lssitepackages 
django               pip
Django-1.3-py2.7.egg-info    pip-1.0.1-py2.7.egg-info
easy-install.pth         setuptools-0.6c11-py2.7.egg
fabric               setuptools.pth
Fabric-1.0.1-py2.7.egg-info  south
geopy                South-0.7.3-py2.7.egg-info
geopy-0.94.1-py2.7.egg-info

这里的问题是(在激活虚拟环境的情况下运行命令):

$ whereis python
python: /usr/bin/python2.6 /usr/bin/python /usr/bin/python2.7 /etc/python2.6 /etc/python /etc/python2.7 /usr/lib/python2.6 /usr/lib/python2.7 /usr/lib64/python2.6 /usr/lib64/python2.7 /usr/local/lib/python2.6 /usr/local/lib/python2.7 /usr/include/python2.6 /usr/include/python2.7 /usr/share/python /usr/share/man/man1/python.1.gz

$ whereis django-admin
django-admin: /usr/bin/django-admin /usr/local/bin/django-admin.py /usr/share/man/man1/django-admin.1.gz

$ whereis fab
fab: /usr/local/bin/fab

我的virtualenv没有使用本地的包!

我该如何强制虚拟环境使用本地的Python和本地版本的包,而不是我电脑上的包呢?


更新 - 可能的解决方案

我用mkvirtualenv --no-site-packages <name>创建了一个新的虚拟环境,现在我得到了这些输出:

$ which python
/home/user/.virtualenvs/VIRTUALENVNAME/bin/python

$ which django-admin
/usr/bin/django-admin

$ which django-admin.py 
/home/user/.virtualenvs/VIRTUALENVNAME/bin/django-admin.py

$ which fab
/home/user/.virtualenvs/VIRTUALENVNAME/bin/fab

听起来现在可以用了……除了“django-admin”命令。

2 个回答

1

你在用两个不同的命令来查找你正在使用的Python版本。第一次你用了“whereis”,第二次用了“which”。其实“whereis”并不是你想用来确认哪个版本在你环境中运行的命令。

从“whereis”的手册中可以看到:

whereis可以找到指定文件的源代码、二进制文件和手册部分。提供的名称会先去掉前面的路径部分和任何单个后缀,比如说.c。它还会处理一些源代码控制的前缀。然后,whereis会尝试在标准的Linux位置中找到你想要的程序。

这里最后一句很重要,whereis“尝试在标准的Linux位置中找到你想要的程序”。当你使用虚拟环境(virtualenv)时,那个Python版本并不在标准的Linux位置里。

所以你应该像第二次那样使用“which”。从“which”的手册中可以看到:

which会返回在当前环境中会被执行的文件(或链接)的路径名。

这才是你用来确认在你的虚拟环境中哪个版本的Python会运行的正确命令。

7

尝试使用以下命令安装虚拟环境:

mkvirtualenv --no-site-packages

这样可以创建一个不依赖任何外部Python库的虚拟环境。

撰写回答