无法找到满足需求的版本 <package>

324

我正在使用以下 requirements.txt 文件在Ubuntu 12.04中安装多个Python包:

numpy>=1.8.2,<2.0.0
matplotlib>=1.3.1,<2.0.0
scipy>=0.14.0,<1.0.0
astroML>=0.2,<1.0
scikit-learn>=0.14.1,<1.0.0
rpy2>=2.4.3,<3.0.0

以及这两个命令:

$ pip install --download=/tmp -r requirements.txt
$ pip install --user --no-index --find-links=/tmp -r requirements.txt

第一个下载包,第二个安装它们。

该过程经常因错误而停止:

  Could not find a version that satisfies the requirement <package> (from matplotlib<2.0.0,>=1.3.1->-r requirements.txt (line 2)) (from versions: )
No matching distribution found for <package> (from matplotlib<2.0.0,>=1.3.1->-r requirements.txt (line 2))

我手动修复它,使用以下方法:

pip install --user <package>

然后再次运行第二个pip install命令即可。

但这仅适用于特定软件包。当我再次运行第二个pip install命令时,该过程现在会停止,并抱怨需要安装另一个必需软件包,我需要重复这个过程,即手动安装新的必需软件包(使用上面的命令),然后再次运行第二个pip install命令。

到目前为止,我不得不手动安装了sixpytznose,现在它又需要安装mock了。

有没有一种方法可以告诉pip自动安装所有需要的依赖项,以便我不必一个一个手动安装?

补充:顺便说一下,这只发生在Ubuntu 12.04中。在Ubuntu 14.04中,应用于requirements.txt文件的pip install命令可以正常工作。


4
有时你的 Django 项目可能依赖于本地的 brew 包。请仔细检查是否已安装这些包! - James111
我曾经遇到过同样的问题,使用“python -m pip install flask”命令成功安装了它。 - Derrick
你检查过你的环境使用的 Python 版本是否与项目的 Python 要求匹配了吗?如果没有,似乎会出现这个错误。例如,我用 conda create -n my_anatome_env python=3.9; conda activate my_anatome_env 解决了这个问题,然后再进行 pip 安装。 - Charlie Parker
19个回答

123
虽然它并没有真正回答这个特定的问题。其他人在犯了同样的错误时也会收到相同的错误信息。
对于那些像我一样最初忘记了 -r 的人:使用 pip install -r requirements.txt-r 对于该命令是必需的。
原始答案: https://dev59.com/XlgQ5IYBdhLWcg3wXizH#42876654

1
希望错误消息告诉我这是由于Python版本不匹配引起的。为什么它没有明确地说呢? - Charlie Parker
1
它确实回答了我的问题! - johannes

107

我已经安装了python3,但我的/usr/bin/python中的python版本仍然是旧的2.7版本。

这个方法有效(在我的情况下,<pkg>pyserial):

python3 -m pip install <pkg>

4
当在setuptools中有python_requires='>=3.0'作为需求时,就会发生这种情况。 - Juan-Kabbali
一个简单的方法来检查这是否适用于您是查看 which pythonwhich pip 之间是否存在目录不匹配。 - crypdick
1
将“pip”替换为“pip3”对我也起作用了。 - Cory Kleiser
3
希望错误信息告诉我这是由于Python版本不匹配引起的。为什么它没有明确说明呢? - Charlie Parker
这在 Kubuntu 22 上给了我一个段错误 :( - B T

83

这种方法(在一个目录中存放所有依赖项而不从索引中下载)只在该目录包含所有软件包时有效。因此,该目录应包含所有依赖项和那些依赖项所依赖的所有软件包(例如sixpytz等)。

因此,您应该在requirements.txt中手动包含它们(这样第一步就可以明确地下载它们),或者您可以使用PyPI安装所有软件包,然后使用pip freeze > requirements.txt来存储所需的所有软件包列表。


1
那么找出所有要求的唯一方法就是在一个工作设置中“冻结”已安装的软件包,然后将其中的所有内容添加到requirements.txt文件中? - Gabriel
3
@Gabriel:目前是这样的,因为许多Python包是通过运行一个包含它们所需依赖项的 setup.py 文件来安装的。一旦Python包变成wheel文件(http://pythonwheels.com),情况就会变得更好,因为它们允许您收集所有需要的软件包列表,而无需在 setup.py 文件中执行任意代码。 - Simeon Visser
2
谢谢你的解释Simeon。还有一件事,如果您不介意的话:为什么这在Ubuntu 14.04中没有发生,但在Ubuntu 12.04中会发生呢? - Gabriel
4
@Gabriel:根据我的经验,如果找不到要安装的软件包,pip总是会终止。话虽如此,pip正在积极开发中,所以你可能使用了我没有使用过的版本。 - Simeon Visser
2
@SimeonVisser,“[wheels]允许您收集所有所需软件包的列表,而无需执行任意代码”,很有趣,能否分享一下如何实现(到现在为止)? - sschuberth
显示剩余2条评论

28

提醒一下那些谷歌这个错误并来到这里的人。

假设我遇到了这个错误:

$ python3 example.py
Traceback (most recent call last):
  File "example.py", line 7, in <module>
    import aalib
ModuleNotFoundError: No module named 'aalib'

因为它提到了 aalib,所以我想尝试一下 aalib

$ python3.8 -m pip install aalib
ERROR: Could not find a version that satisfies the requirement aalib (from versions: none)
ERROR: No matching distribution found for aalib

但实际上这是错误的软件包名称,请确保使用pip search目前已停止服务),或者使用谷歌,或在pypi网站上搜索以获取准确的软件包名称:

图片描述

然后成功安装:

$ python3.8 -m pip install python-aalib
Collecting python-aalib
  Downloading python-aalib-0.3.2.tar.gz (14 kB)
...

pip --help 所述:

$ python3.8 -m pip --help
...
  -v, --verbose               Give more output. Option is additive, and can be used up to 3 times.

为了有一种系统的方法来找出根本原因,而不是依赖运气,你可以在pip命令后添加-vvv选项以查看细节,例如:

$ python3.8 -u -m pip install aalib -vvv
User install by explicit request
Created temporary directory: /tmp/pip-ephem-wheel-cache-b3ghm9eb
Created temporary directory: /tmp/pip-req-tracker-ygwnj94r
Initialized build tracking at /tmp/pip-req-tracker-ygwnj94r
Created build tracker: /tmp/pip-req-tracker-ygwnj94r
Entered build tracker: /tmp/pip-req-tracker-ygwnj94r
Created temporary directory: /tmp/pip-install-jfurrdbb
1 location(s) to search for versions of aalib:
* https://pypi.org/simple/aalib/
Fetching project page and analyzing links: https://pypi.org/simple/aalib/
Getting page https://pypi.org/simple/aalib/
Found index url https://pypi.org/simple
Getting credentials from keyring for https://pypi.org/simple
Getting credentials from keyring for pypi.org
Looking up "https://pypi.org/simple/aalib/" in the cache
Request header has "max_age" as 0, cache bypassed
Starting new HTTPS connection (1): pypi.org:443
https://pypi.org:443 "GET /simple/aalib/ HTTP/1.1" 404 13
[hole] Status code 404 not in (200, 203, 300, 301)
Could not fetch URL https://pypi.org/simple/aalib/: 404 Client Error: Not Found for url: https://pypi.org/simple/aalib/ - skipping
Given no hashes to check 0 links for project 'aalib': discarding no candidates
ERROR: Could not find a version that satisfies the requirement aalib (from versions: none)
Cleaning up...
Removed build tracker: '/tmp/pip-req-tracker-ygwnj94r'
ERROR: No matching distribution found for aalib
Exception information:
Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/pip/_internal/cli/base_command.py", line 186, in _main
    status = self.run(options, args)
  File "/usr/lib/python3/dist-packages/pip/_internal/commands/install.py", line 357, in run
    resolver.resolve(requirement_set)
  File "/usr/lib/python3/dist-packages/pip/_internal/legacy_resolve.py", line 177, in resolve
    discovered_reqs.extend(self._resolve_one(requirement_set, req))
  File "/usr/lib/python3/dist-packages/pip/_internal/legacy_resolve.py", line 333, in _resolve_one
    abstract_dist = self._get_abstract_dist_for(req_to_install)
  File "/usr/lib/python3/dist-packages/pip/_internal/legacy_resolve.py", line 281, in _get_abstract_dist_for
    req.populate_link(self.finder, upgrade_allowed, require_hashes)
  File "/usr/lib/python3/dist-packages/pip/_internal/req/req_install.py", line 249, in populate_link
    self.link = finder.find_requirement(self, upgrade)
  File "/usr/lib/python3/dist-packages/pip/_internal/index/package_finder.py", line 926, in find_requirement
    raise DistributionNotFound(
pip._internal.exceptions.DistributionNotFound: No matching distribution found for aalib
从上面的日志可以很明显地看到URL https://pypi.org/simple/aalib/ 返回404 not found。那么您可以猜测导致404的可能原因,例如包名错误。另一件事是我可以修改pip模块的相关Python文件以进一步使用上述日志进行调试。要编辑.whl文件,您可以使用wheel命令来unpackpack

3
是的,我因为打错了包名而卡了两个小时。感谢你的提示。 - Pavlos Ponos
通常情况下,这也可能是错误版本的安装,请注意软件包的发布版本。 - Libby Lebyane
pip search no longer works. See below:RuntimeError: PyPI no longer supports 'pip search' (or XML-RPC search). Please use https://pypi.org/search (via a browser) instead. See https://warehouse.pypa.io/api-reference/xml-rpc.html#deprecated-methods for more information. - Azmat

20

经过两个小时的搜索,我找到了一种只需一行命令即可修复的方法。您需要知道包的版本(只需搜索PACKAGE版本)。

命令:

python3 -m pip install --pre --upgrade PACKAGE==VERSION.VERSION.VERSION

11

以下命令对我有效:

python -m pip install flask

7

并非总是如此,但在某些情况下,包已经存在。例如-getpass。它未列在“pip list”中,但可以导入和使用:

enter image description here

如果我尝试使用pip安装getpass,会出现如下错误:"无法找到满足要求的版本 getpass"。

这种情况也发生在我身上。尝试导入shlex并收到“找不到满足要求的版本 shlex(来自版本:none)” 的错误提示。这是因为它已经安装好了(内置?)。 - harperville

4
如果你在工作场所遇到此问题,这可能是解决方案。
pip install -U <package_name> --user --proxy=<your proxy>

4
由于这是一个非常让初学者困扰的问题,可能需要很长时间来解决,因此我在这里写了一个完整的指南。

如果你正在运行 pip install PACKAGEpython -m pip install PACKAGE,并且报告了 no matching version found 错误,那么以下是如何解决该问题的方法。

  1. 在浏览器中搜索你的包,例如我的包名为 pycypto,在这里我搜索 pycypto pypi

  2. 找到你的包,在 pypi 上打开链接,点击 下载文件

  3. 打开 Python shell,在已安装的任何包中导入,例如,我之前安装了 Pillow。

>>> import PIL
>>> PIL.__path__
['/Applications/MAMP/htdocs/canvas/src/zzd/env/lib/python3.7/site-packages/PIL']

PACKAGE.__path__函数可以帮助你获得“副包”路径,所有的包都应该放到这里。

此外: 如果你不知道之前安装了哪些包,可以运行pip list来获取已安装包的列表。

  1. 获取路径后,在终端中打开并切换到该路径。
cd /Applications/MAMP/htdocs/canvas/src/zzd/env/lib/python3.7/site-packages/
open
  1. 解压下载的文件,将其拖入site-packages中。

  2. 进入下载目录,运行setup.py以进行安装。

cd pycrypto-2.6.1
python setup.py install

然后您应该能够在Python中导入并使用该软件包。

4
尝试使用以下命令通过PowerShell安装Flask。
pip install --isolated Flask

这将允许安装避免环境变量和用户配置。

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