pip安装未正确处理依赖,特别是numpy/scipy/...等依赖?

1 投票
2 回答
3327 浏览
提问于 2025-04-18 08:12

我正在创建一个虚拟环境(系统信息如下),但是发现numpy、scipy和pandas这几个库的依赖关系处理得不太对。

具体来说,这个问题似乎和numpy是否在requirements.txt文件里没有关系,即使它们的顺序是正确的,问题依然存在。

这让人觉得很不方便,感觉和包管理器应该工作的方式正好相反,我觉得有点奇怪 :)

那么这是怎么回事呢?当我从头开始构建虚拟环境时,输出结果是:

[bdundee@etl-dev Py26]$ ls
requirements.txt  requirements.txt~
[bdundee@etl-dev Py26]$ virtualenv ./env/sqrt_python26 --no-site-packages
New python executable in ./env/sqrt_python26/bin/python
Installing setuptools, pip...done.
[bdundee@etl-devPy26]$ source ./env/sqrt_python26/bin/activate
(sqrt_python26)[bdundee@etl-devPy26]$ pip install -r ./requirements.txt 
Downloading/unpacking Bottleneck==0.8.0 (from -r ./requirements.txt (line 6))

...

    import numpy as np

ImportError: No module named numpy

很明显,numpy应该被当作Bottleneck的依赖,但实际上并没有。matplotlib也出现了同样的问题。

Bottleneck并不是唯一有这个问题的模块,还有其他几个。这让我不得不创建一个pre_pip.sh脚本:

#!/usr/bin/bash

## Install numpy                                                                                                                                                                      
pip install numpy==1.7.1

## Install scipy                                                                                                                                                                      
pip install scipy==0.12.0

## Install pandas                                                                                                                                                                     
pip install pandas==0.12.0

我还遇到了scipy和pandas的错误(例如,statsmodels)。

我的问题是:

  • 这些包的安装说明里有bug吗?
  • 这是numpy特有的问题吗?
  • 有没有办法在不使用一个“预先”构建脚本来安装numpy、scipy和pandas的情况下解决这个问题?

系统信息:

  • AWS CentOS(当前版本)
  • Python 2.6.9
  • numpy 1.7.1

2 个回答

2

看起来这是在用requirements.txt时,几个不同的包出现了问题。你可以写个脚本,逐行读取这个文件,然后一个一个地安装这些包。我相信还有更优雅的方法来处理这个问题,但至少这样做可以按顺序安装,这样就不会出现错误了。

import pip
with open("requirements.txt", "r") as f:
    for line in f:
        pip.main(['install', line])
3

pip的工作方式大致是这样的(如果我说错了,请随意纠正我)。

  • 每个文件会被下载并解压。
  • 每个文件会通过 python setup.py build 进行构建。
  • 每个文件会通过 python setup.py install 进行安装。

问题在于,有些模块的 setup.py 文件在构建或安装时需要这些模块本身已经存在,这就导致如果像numpy、scipy等在 requirements.txt 文件中,就无法满足这个要求。

对于matplotlib也有类似的问题,pip社区的看法是“这不是pip的问题”。这也说得过去。

在我看来,最好的解决办法就是写一个包装器。如果其他人知道更好的方法,请告诉我哦 :)

#!/usr/bin/bash

INSTALL_DIR=$IMPORT/../Environment/Py26/env/sqrt_python26

## Step 1: build the virtualenv
virtualenv $INSTALL_DIR

## Now use the virtualenv
source $INSTALL_DIR/bin/activate

## Install numpy
pip install numpy==1.7.1

## Install scipy
pip install scipy==0.12.0

## Install pandas
pip install pandas==0.12.0

## Some others...
pip install patsy==0.2.1
pip install pycurl==7.19.0

## Now run requirements.txt
pip install -r ./requirements.txt

## finished, shut down virtualenv
deactivate

撰写回答