pip安装未正确处理依赖,特别是numpy/scipy/...等依赖?
我正在创建一个虚拟环境(系统信息如下),但是发现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