`pip install -r requirements.txt`安装的包找不到

4

我正在尝试运行一个继承的Django项目。我已经设置了virtualenv,并尝试通过pip install -r requirements.txt传递requirements文件。一切似乎都正常。它告诉我它正在正确的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

但是当我尝试同步数据库或运行服务器时,

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),现在可以找到该包。

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


你确定你是在同一个虚拟环境中使用 pip 吗?检查一下 which pip - alecxe
是的。/Users/me/.virtualenvs/example/bin/pip。而且因为当我手动使用pip安装包而不是通过requirements.txt时,它们可以正常工作。 - AlexQueue
当你运行 pip install django-mediasync,会得到什么结果? - Hieu Nguyen
@HieuNguyen 它安装正确,当我尝试导入它时能够正常找到。我不知道为什么用pip install -r requirements.txt安装不起作用(是的,我会在我的requirements.txt文件中列出django-mediasync)。 - AlexQueue
那么 requirements.txt 文件中有问题。你能展示它的内容吗? - François Constant
如下评论所述,请查看并检查此链接是否适用于您的情况:https://dev59.com/4Ggu5IYBdhLWcg3w3qt7#11015904 - hgcrpd
2个回答

3

我认为在执行pip install -r requirements.txt命令时出现了一些错误,但您没有注意到。基本上,整个操作将在出现错误的时候停止。

例如,您的requirements.txt文件中有以下4个软件包:

A
B
C
D

如果在安装B时出现错误,将无法安装3个包B, CD。我认为您的requirements.txt中有一个软件包的安装出现错误,因此django-mediasync没有被安装。
如果我的假设是正确的,请执行pip install -r requirements.txt并检查traceback的最后部分。如果有任何失败信息,您将知道失败的原因。

3
我相信软件包A也不会被安装。我的理解是,如果其中一个软件包失败,pip会终止整个命令。 - hgcrpd
我认为 pip 使用串行操作,所以包 A 将会被安装。但是实际上我不太确定,现在也没有时间进行测试。 - Hieu Nguyen
在我使用scipy遇到问题时,我找到了这个:https://dev59.com/4Ggu5IYBdhLWcg3w3qt7#11015904 - hgcrpd
错误信息看起来并不像是一个错误信息,所以我认为没有发生错误。 - AlexQueue
我的经验与@hgcrpd一致——pip会逐个下载和构建,但实际的安装直到最后才发生。因此,如果在过程中出现任何错误,那么就不会安装任何软件包。 - Owen

1
你是在执行 sudo pip install django-mediasync 或者 sudo pip install -r requirements.txt 吗?如果是的话,它会在虚拟环境之外进行安装。请参考 如何在虚拟环境中安装需要 "sudo" 的程序?
基本上因为你的用户应该拥有虚拟环境目录,所以你不需要超级用户权限通过 pip 安装任何东西。执行 which pipsudo which pip 你会发现它们是不同的。
另一个可能性是你的 requirements.txt 没有正确安装。它可能输出像你提到的那行一样的信息,但显然 pip 会在安装任何东西之前扫描 requirements.txt 中的所有软件包。如果出现任何错误,它将中止所有软件包的安装。

我不会为任何一个执行sudo。 - AlexQueue
啊,感谢您澄清了“pip install -r”的“全有或全无”特性!非常有教育意义。 - starlocke
事实上,我的经验与“全输或全赢”理论相矛盾。由于某种原因,一些软件包得以成功安装,而另一些则未能安装。我设法修复了我的“requirements.txt”文件中的一行(为其中一个软件包添加了一个特定版本号),这使pip继续进行了大量的安装。一旦pip完成了工作,“pip list”显示的结果是部分安装。神秘! - starlocke

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