使用pip安装的包未在pip freeze中显示?

6

我在Debian Wheezy上使用virtualenvpip。我遇到了一个奇怪的问题,即安装包似乎安装成功,但在虚拟环境中却不可见。

这是我的requirements.txt文件:

Django==1.7.7
psycopg2==2.5.4
django-geojson==2.6.0

如果我在虚拟环境中使用 pip 安装它,它会显示所有的安装内容:
(.venv)$ sudo pip install -r requirements.txt
Requirement already satisfied (use --upgrade to upgrade): Django==1.7.7 in /usr/local/lib/python2.7/dist-packages (from -r requirements/base.txt (line 1))
Requirement already satisfied (use --upgrade to upgrade): psycopg2==2.5.4 in /usr/local/lib/python2.7/dist-packages (from -r requirements/base.txt (line 2))
Requirement already satisfied (use --upgrade to upgrade): django-geojson==2.6.0 in /usr/local/lib/python2.7/dist-packages (from -r requirements/base.txt (line 3))
Requirement already satisfied (use --upgrade to upgrade): six in /usr/local/lib/python2.7/dist-packages (from django-geojson==2.6.0->-r requirements/base.txt (line 3))
Cleaning up...

但是,如果我运行pip freeze来查看安装了哪些软件包,它显示的是pip认为我有一个完全不同的软件包集合,特别是它没有看到djgeojson

(.venv)$ pip freeze
Django==1.7.4
argparse==1.2.1
coverage==3.7.1
distribute==0.6.24
django-debug-toolbar==1.2.1
gunicorn==19.3.0
psycopg2==2.5.4
requirements==0.1
setproctitle==1.1.8
sqlparse==0.1.14
wsgiref==0.1.2

如果我启动 Python 终端,Python 看不到 djgeojson。为什么会这样发生?这很令人困惑。


我认为问题在于pip将东西安装到了/usr/local/lib/python2.7/dist-packages,但这个路径不在sys.path上。但是为什么pip会选择将软件包安装到自己路径之外的地方呢? - Richard
你为什么要使用sudo安装,然后又不用sudo进行pip冻结? - Peter
好的,如果我运行 sudo pip freeze,我会看到相同版本的软件包。那么 pip 看到的内容是否取决于您作为哪个 Linux 用户运行它?这很令人惊讶。 - Richard
1个回答

12

你的问题在于使用sudo安装了依赖项,它们被安装在系统python库文件夹中,而不是虚拟环境venv库中。

该怎么办?运行相同的命令,但这次不要用sudo:pip install -r requirements.txt。 这将从虚拟环境运行pip并将软件包安装到正确的位置。

当你激活虚拟环境,例如使用source path/to/my/venv/bin/acivate,当前用户的路径变量$PATH会更新,然后当你以sudo方式运行某些东西时,刚刚在激活虚拟环境时更新的这个新的$PATH已经不再是相同的了。 当你打开一个新的shell窗口或使用su登录另一个用户或运行sudo时,$PATH变量不是全局系统变量。


1
谢谢您的回答。问题是,如果我尝试在没有sudo的情况下安装软件包,我会遇到权限错误:(.venv)$ pip install -r requirements.txt Downloading/unpacking Django==1.7.7 (from -r requirements/base.txt (line 1)) Running setup.py egg_info for package Django Source in ./.venv/build/Django has the version 1.7, which does not match the requirement Django==1.7.7 (from -r requirements/base.txt (line 1)) Source in ./.venv/build/Django has version 1.7 that conflicts with Django==1.7.7 (from -r requirements/base.txt (line 1)) Storing complete log in /home/me/.pip/pip.log - Richard
然后,如果我尝试运行 (.venv)$ pip uninstall Django,以摆脱冲突,我会得到 OSError: [Errno 13] Permission denied: '/webapps/.venv/lib/python2.7/site-packages/Django-1.7.4-py2.7.egg-info/dependency_links.txt'。我能否在不使用 sudo 的情况下解决这个问题? - Richard
没错,你最后的评论回答了你的问题。由于你在requirements.txt中拥有所有的要求,所以你可以删除当前的一个 sudo rm -rf /webapps/.venv/,然后创建一个新的 virtualenv /webapps/.venv,激活这个环境 source /webapps/.venv/bin/activate 并使用 pip install -r requirements.txt 安装要求。 - Tim Rijavec
只需创建一个新的虚拟环境,然后再次安装您的 requirements.txt。 - Peter
@TimRijavec 谢谢你的解释。这很有效,我终于明白为什么“sudo pip install”是个坏主意了 :) - Richard
显示剩余3条评论

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