小能豆

找不到满足要求 <package> 的版本

py

我正在使用以下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命令。

到目前为止,我必须手动安装six、、,现在它抱怨需要。pytz``nose``mock

有没有办法pip自动安装所有需要的依赖项,这样我就不必逐个手动执行操作?

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


阅读 51

收藏
2024-10-07

共1个答案

小能豆

您遇到的问题源于 Ubuntu 12.04(2012 年发布)相对较旧,一些现代 Python 包可能没有与此版本兼容的预构建二进制文件或依赖项。此外,Ubuntu 12.04 存储库已过时,可能无法pip自动解析依赖项。

以下是处理这种情况并自动解决依赖关系的一些策略:

1.升级pipsetuptools、 和wheel

在做任何其他事情之前,必须确保您拥有最新版本的pipsetuptoolswheel(这有助于从源代码构建软件包)。由于您使用的是 Ubuntu 12.04,这些工具的默认版本可能已过时。

运行以下命令来更新它们:

pip install --upgrade pip setuptools wheel

2.使用现代 Python 版本

如果你正在使用系统 Python 版本(在 Ubuntu 12.04 中可能是 Python 2.7 或 3.2),请考虑使用pyenv或等工具安装较新的 Python 版本,如 3.7 或更高版本miniconda。这可以避免与旧 Python 版本的兼容性问题。

为了pyenv

curl https://pyenv.run | bash
# Install Python 3.7 or higher
pyenv install 3.7.12
pyenv global 3.7.12

为了miniconda

# Download and install miniconda
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
bash Miniconda3-latest-Linux-x86_64.sh

这将安装 Python 3.7+ 并设置较新的 Python 环境。

3.使用虚拟环境

创建虚拟环境,这样就可以避免与系统范围的软件包发生冲突。如果你尚未virtualenv安装,可以使用以下命令进行安装:

pip install virtualenv

然后创建并激活虚拟环境:

virtualenv venv
source venv/bin/activate

requirements.txt现在,尝试在虚拟环境中安装。

4.自动检查缺失的依赖项

requirements.txt如果错误仍然存在,您可以添加一个步骤,使用--no-binary从源代码构建所有内容的选项明确安装文件中软件包的依赖项,这应该可以解决缺少的依赖项。

修改安装命令的方法如下:

pip install --user --no-binary :all: -r requirements.txt

pip将强制从源代码编译包并解决依赖关系。

5.使用--use-deprecated=legacy-resolver

当前pip解析器对依赖项解析更加严格。您可以尝试使用较旧、更宽松的解析器作为解决方法,即使某些版本发生冲突,也可以强制安装依赖项。这是一个临时解决方法,但可能在 Ubuntu 12.04 等环境中有所帮助。

pip install --user --use-deprecated=legacy-resolver -r requirements.txt

6.使用预制轮子

某些软件包需要编译,这在较旧的系统上可能会失败。您可以尝试使用预构建的 wheel 来避免此问题。为此,请使用以下--only-binary选项:

pip install --user --only-binary :all: -r requirements.txt

这将强制pip安装仅预先构建的二进制包(如果可用)而不是从源代码编译,从而可能会跳过一些手动安装。

7.固定版本requirements.txt

您还可以尝试直接在 中固定缺失依赖项的版本requirements.txt。例如,如果sixpytznose反复导致问题,您可以像这样手动添加它们:

six>=1.10.0
pytz>=2016.7
nose>=1.3.7
mock>=2.0.0

这将确保pip自动安装必要的版本。

8.升级到较新的 Ubuntu 版本

虽然这可能无法立即实现,但升级到较新的 Ubuntu 版本(例如 14.04、16.04 或更高版本)将自动解决其中许多问题。较新版本的 Ubuntu 具有较新的库和软件包支持,这有助于避免兼容性问题pip

9.最后命令

按照上述步骤后,安装依赖项的最终命令requirements.txt可能如下所示:

pip install --upgrade pip setuptools wheel
pip install --user --no-binary :all: -r requirements.txt

或者:

pip install --user --use-deprecated=legacy-resolver -r requirements.txt

概括:

  1. 升级pipsetuptools、 和wheel
  2. 使用现代 Python 版本(使用pyenvminiconda)。
  3. 使用虚拟环境来隔离您的依赖关系。
  4. 使用--no-binary或旧式解析器自动检查缺少的依赖项。
  5. 在您的 中固定已知依赖项requirements.txt
  6. 考虑将您的操作系统升级到较新的版本以获得更好的兼容性。

通过遵循这些策略,您应该能够解决 Ubuntu 12.04 中的软件包安装问题,而无需手动安装每个缺失的软件包。

2024-10-07