【问题标题】:Packages installed by `pip install -r requirements.txt` are not found找不到通过 `pip install -r requirements.txt` 安装的软件包
【发布时间】:2013-07-21 19:07:17
【问题描述】:

我正在尝试运行一个继承的 Django 项目。我已经设置了一个 virtualenv 并尝试通过pip install -r requirements.txt 传递需求文件。一切似乎都奏效了。它告诉我它在正确的 virtualenv 中工作,并且软件包似乎已安装,例如:

Downloading/unpacking django-mediasync==2.2.0 (from -r requirements.txt (line 22))
  Downloading django-mediasync-2.2.0.tar.gz
  Running setup.py egg_info for package django-mediasync

但是当我尝试 syncdb 或 runserver 时,

Unhandled exception in thread started by <bound method Command.inner_run of <django.contrib.staticfiles.management.commands.runserver.Command object at 0x10f15e290>>
Traceback (most recent call last):
  File "/Users/me/.virtualenvs/example/lib/python2.7/site-packages/django/core/management/commands/runserver.py", line 88, in inner_run
    self.validate(display_num_errors=True)
  File "/Users/me/.virtualenvs/example/lib/python2.7/site-packages/django/core/management/base.py", line 249, in validate
    num_errors = get_validation_errors(s, app)
  File "/Users/me/.virtualenvs/example/lib/python2.7/site-packages/django/core/management/validation.py", line 36, in get_validation_errors
    for (app_name, error) in get_app_errors().items():
  File "/Users/me/.virtualenvs/example/lib/python2.7/site-packages/django/db/models/loading.py", line 146, in get_app_errors
    self._populate()
  File "/Users/me/.virtualenvs/example/lib/python2.7/site-packages/django/db/models/loading.py", line 61, in _populate
    self.load_app(app_name, True)
  File "/Users/me/.virtualenvs/example/lib/python2.7/site-packages/django/db/models/loading.py", line 76, in load_app
    app_module = import_module(app_name)
  File "/Users/me/.virtualenvs/example/lib/python2.7/site-packages/django/utils/importlib.py", line 35, in import_module
    __import__(name)
ImportError: No module named mediasync

奇怪的是我手动安装了mediasync(或任何其他必要的包)(pip install django-mediasync),现在可以找到包了。

我做错了什么?我不想手动安装所有这些包。

【问题讨论】:

  • 你确定,你使用的是来自同一个 virtualenv 的pip 吗?检查which pip
  • 是的。 /Users/me/.virtualenvs/example/bin/pip。也因为当我使用 pip “手动”而不是通过 requirements.txt 安装包时,它们运行得很好。
  • 运行pip install django-mediasync,结果是什么?
  • @HieuNguyen 它安装正确,然后在我尝试导入它时正确找到。我不知道为什么它适用于 pip install -r requirements.txt(是的,我会在我的 requirements.txt 文件中列出 django-mediasync)
  • 那么 requirements.txt 文件中存在问题。你能展示它的内容吗?

标签: python django virtualenv pip


【解决方案1】:

我认为在这样做时:pip install -r requirements.txt 出现了一些错误,但您没有注意到。基本上整个操作会在出现错误时停止。

例如,您的 requirements.txt 有 4 个这样的包:

A
B
C
D

如果安装B时出现错误,则不会安装BCD这3个包。在我看来,在您的 requirements.txt 中安装一个软件包时出现错误,并且根本没有安装 django-mediasync

如果我的假设是正确的,请执行pip install -r requirements.txt 并检查回溯的最后部分。如果某事失败了,你会知道确切的原因。

【讨论】:

  • 我相信包 A 也不会被安装。我的理解是,如果其中一个包失败,pip 将中止整个命令。
  • 我认为pip 使用串行操作,因此将安装包A。但是是的,实际上我不太确定,现在没有时间进行测试。
  • 来吧,我在 scipy 给我问题时发现了这个:stackoverflow.com/a/11015904/439500
  • 错误信息看起来不像是错误信息,所以我认为没有发生错误。
  • 我自己的经验与@hgcrpd 一致——pip 会连续下载和构建,但实际安装要到最后才会发生。因此,如果在此过程中发生任何错误,则不会安装任何软件包。
【解决方案2】:

你是sudo pip install django-mediasync 还是sudo pip install -r requirements.txt?如果是这样,它将把它安装在 virtualenv 之外。见How to install which programs requires "sudo" in virtualenv?

基本上因为你的用户应该拥有 virtualenv 目录,你不需要超级用户权限来通过 pip 安装任何东西。执行which pipsudo which pip,您会发现它们是不同的。

另一种可能是您的 requirements.txt 没有正确安装。它可能会像您提到的那样输出行,但显然 pip 会在安装任何东西之前扫描 requirements.txt 中的所有包。如果有任何错误,它将中止所有包的安装。

【讨论】:

  • 我也没有做 sudo。
  • 啊。感谢您阐明“pip install -r”的“全有或全无”性质!很有教育意义。
  • 实际上,我的经历与“全有或全无”理论相矛盾。无论出于何种原因,许多软件包都成功安装了,而有些软件包没有安装。我设法修复了我的“requirements.txt”中的一行(向其中一个包添加了特定版本),这让 pip 继续进行了大量安装。一旦 pip 完成,“pip list”显示结果是部分安装。神秘!
猜你喜欢
  • 1970-01-01
  • 2012-06-16
  • 1970-01-01
  • 2020-01-11
  • 2021-08-05
  • 1970-01-01
  • 1970-01-01
  • 2013-09-08
  • 2022-10-06
相关资源
最近更新 更多