【问题标题】:Installed packages with pip are not shown in pip freeze?使用 pip 安装的软件包没有显示在 pip freeze 中?
【发布时间】:2015-04-01 10:29:31
【问题描述】:

我在 Debian Wheezy 上使用 virtualenv 和 pip。我遇到了一个奇怪的问题,其中软件包似乎可以安装,但在 virtualenv 中不可见。

这是我的requirements.txt 文件:

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

如果我在我的 virtualenv 中使用 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 会选择将软件包安装到不在自己路径上的地方呢?
  • 你为什么要使用sudo安装,然后不使用sudo冻结pip?
  • 好的,如果我运行sudo pip freeze,我会看到相同版本的包。那么pip 看到的内容是否取决于您以哪个 Linux 用户身份运行它?这……令人惊讶。

标签: python pip virtualenv


【解决方案1】:

您的问题是您已经使用 sudo 安装了需求,并且它们安装在您的系统 python 库文件夹中,而不是安装在您的虚拟环境的 venv 库中。

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

当您使用 source path/to/my/venv/bin/acivate 激活虚拟环境 e.q 时,当前用户的路径变量 $PATH 会更新,然后当您使用 sudo 运行某些东西时,您在激活虚拟环境时刚刚更新的这个新 $PATH不再一样了。当您打开一个新的 shell 窗口或使用 su 以其他用户身份登录或运行 sudo,$PATH 变量不是全局系统变量时,也会发生同样的情况。

【讨论】:

  • 感谢您的回答。问题是,如果我尝试在没有 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
  • 然后如果我尝试运行(.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 的情况下解决这个问题吗?
  • 我想我可以使用sudo 删除/webapps/.venv/lib/python2.7/site-packages/Django-1.7.4-py2.7.egg-info 中的所有内容 - 这可能有效吗?但我总是对删除文件而不是使用“官方”路线卸载感到紧张。
  • 这些权限错误非常令人困惑 - 当我以非超级用户身份安装 Django 时,它必须安装到 /webapps/.venv/lib/python2.7/site-packages/,但现在除非我让自己成为超级用户,否则它不会让我删除它 - 什么那个?
  • 感谢$PATH的解释,我没看明白。
猜你喜欢
  • 1970-01-01
  • 2019-01-24
  • 2015-09-21
  • 1970-01-01
  • 1970-01-01
  • 2017-06-25
  • 2019-12-24
  • 1970-01-01
相关资源
最近更新 更多