我正在使用以下requirements.txt文件在 Ubuntu 12.04 中安装几个 Python 包:
requirements.txt
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命令时,进程停止了,现在抱怨另一个必需的包,我需要再次重复该过程,即:手动安装新的必需包(使用上面的命令),然后运行第二条pip install命令。
到目前为止,我必须手动安装six、、,现在它抱怨需要。pytz``nose``mock
six
pytz``nose``mock
有没有办法pip自动安装所有需要的依赖项,这样我就不必逐个手动执行操作?
pip
补充:顺便说一下,这只发生在 Ubuntu 12.04 中。在 Ubuntu 14.04 中,pip install应用于requirements.txt文件的命令可以正常工作。
您遇到的问题源于 Ubuntu 12.04(2012 年发布)相对较旧,一些现代 Python 包可能没有与此版本兼容的预构建二进制文件或依赖项。此外,Ubuntu 12.04 存储库已过时,可能无法pip自动解析依赖项。
以下是处理这种情况并自动解决依赖关系的一些策略:
setuptools
wheel
在做任何其他事情之前,必须确保您拥有最新版本的pip、setuptools和wheel(这有助于从源代码构建软件包)。由于您使用的是 Ubuntu 12.04,这些工具的默认版本可能已过时。
运行以下命令来更新它们:
pip install --upgrade pip setuptools wheel
如果你正在使用系统 Python 版本(在 Ubuntu 12.04 中可能是 Python 2.7 或 3.2),请考虑使用pyenv或等工具安装较新的 Python 版本,如 3.7 或更高版本miniconda。这可以避免与旧 Python 版本的兼容性问题。
pyenv
miniconda
为了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 环境。
创建虚拟环境,这样就可以避免与系统范围的软件包发生冲突。如果你尚未virtualenv安装,可以使用以下命令进行安装:
virtualenv
pip install virtualenv
然后创建并激活虚拟环境:
virtualenv venv source venv/bin/activate
requirements.txt现在,尝试在虚拟环境中安装。
requirements.txt如果错误仍然存在,您可以添加一个步骤,使用--no-binary从源代码构建所有内容的选项明确安装文件中软件包的依赖项,这应该可以解决缺少的依赖项。
--no-binary
修改安装命令的方法如下:
pip install --user --no-binary :all: -r requirements.txt
这pip将强制从源代码编译包并解决依赖关系。
--use-deprecated=legacy-resolver
当前pip解析器对依赖项解析更加严格。您可以尝试使用较旧、更宽松的解析器作为解决方法,即使某些版本发生冲突,也可以强制安装依赖项。这是一个临时解决方法,但可能在 Ubuntu 12.04 等环境中有所帮助。
pip install --user --use-deprecated=legacy-resolver -r requirements.txt
某些软件包需要编译,这在较旧的系统上可能会失败。您可以尝试使用预构建的 wheel 来避免此问题。为此,请使用以下--only-binary选项:
--only-binary
pip install --user --only-binary :all: -r requirements.txt
这将强制pip安装仅预先构建的二进制包(如果可用)而不是从源代码编译,从而可能会跳过一些手动安装。
您还可以尝试直接在 中固定缺失依赖项的版本requirements.txt。例如,如果six、pytz和nose反复导致问题,您可以像这样手动添加它们:
pytz
nose
six>=1.10.0 pytz>=2016.7 nose>=1.3.7 mock>=2.0.0
这将确保pip自动安装必要的版本。
虽然这可能无法立即实现,但升级到较新的 Ubuntu 版本(例如 14.04、16.04 或更高版本)将自动解决其中许多问题。较新版本的 Ubuntu 具有较新的库和软件包支持,这有助于避免兼容性问题pip。
按照上述步骤后,安装依赖项的最终命令requirements.txt可能如下所示:
pip install --upgrade pip setuptools wheel pip install --user --no-binary :all: -r requirements.txt
或者:
通过遵循这些策略,您应该能够解决 Ubuntu 12.04 中的软件包安装问题,而无需手动安装每个缺失的软件包。