pip无法从requirements.txt安装软件包

31

我正在尝试使用 requirements 文件安装一个 Python 软件。

>> cat requirements.txt
Cython==0.15.1
numpy==1.6.1
distribute==0.6.24
logilab-astng==0.23.1logilab-common==0.57.1
netaddr==0.7.6
numexpr==2.0.1
ply==2.5
pycallgraph==0.5.1
pyflowtools==0.3.4.1
pylint==0.25.1
tables==2.3.1
wsgiref==0.1.2

我创建了一个虚拟环境

>> mkvirtualenv parser

(parser)
>> pip freeze
distribute==0.6.24
wsgiref==0.1.2

(parser)
>> pip install -r requirements.txt

...然后我下载了一些软件包,但是它们没有安装成功并显示错误:http://pastie.org/4079800

(parser)
>> pip freeze
distribute==0.6.24
wsgiref==0.1.2

令人惊讶的是,如果我尝试手动安装每个软件包,它们就可以很好地安装。 例如:

>> pip install numpy==1.6.1

(parser)
>> pip freeze
distribute==0.6.24
wsgiref==0.1.2
numpy==1.6.1

我很迷茫。发生了什么事?

PS:我正在使用pip v1.1和python v2.7.2,使用virtualenvvirtualenvwrapper


我遇到了与shap相同的问题。 - lstodd
3个回答

25
看起来 numexpr 包在安装时依赖于numpy。 Pip 通过两个步骤处理您的需求:首先,它下载所有包并运行每个包的setup.py来获取其元数据,然后在第二步中将它们全部安装。
因此,numexpr 正在尝试在其 setup.py 中从 numpy 导入,但是当 pip 首次运行 numexpr 的 setup.py 时,numpy 尚未被安装。
这也是为什么在逐个安装软件包时不会看到此错误的原因:如果逐个安装它们,则 numpy 将在您的环境中完全安装,然后您才能 pip install numexpr。
唯一的解决方案是在您运行pip install -r requirements.txt 之前安装 pip install numpy -- 您将无法使用单个 requirements.txt 文件在单个命令中执行此操作。
更多信息请参见: https://github.com/pypa/pip/issues/25

2
这似乎是 numexpr 中的一个打包错误;它的 setup.py 应该被修改为仅在实际构建时从 numpy 导入,例如通过捕获 ImportError 并在只运行 setup.py egg_info 时不使用 extra_setup_opts 来继续。 - ejucovy
7
我们(pip)可能应该有一份关于这个的指南,或者至少链接到现有的文档。 - user146416
2
你应该在numexpr上提交问题 - jterrace
另一个解决方案可能是将numpy放入另一个文件,如requirements1.txt,并首先安装它,以避免手动安装所有依赖包。 - hello.wjx

8

我遇到了类似的问题,并最终得出以下解决方案:

cat requirements.txt | sed -e '/^\s*#.*$/d' -e '/^\s*$/d' | xargs -n 1 python -m pip install

这将逐行读取requirements.txt文件并执行pip。我无法准确找到答案来源,因此对此表示歉意,但是我在下面找到了一些合理的解释:

  1. sed的工作原理:https://howto.lintel.in/truncate-empty-lines-using-sed/
  2. 另一个类似的使用git的答案:https://dev59.com/t2Yr5IYBdhLWcg3wnrV0#46494462

希望这些能够提供一些替代方案。


这对我来说有效,但我不知道为什么正常的方法不起作用。我正在使用vast.ai的GPU。 - undefined

0
有时候这真的很烦人,pip 的一个 bug。 当你运行 pip install package_name 时,pip 会先运行 pip check 来检查目标包,并安装所有依赖(目标包)所需的包。 但是当你运行 pip install -r requirements.txt 时,pip 将尝试直接按顺序从上到下安装列出的所有所需包。有时依赖项会列在它所依赖的包之上。
The solution is simple:
1.pip install package_name
2.simply put the error package to the bottom of the requirements.txt
3.sometimes a particular version of the package is not be able to  be installed,just install the newest version of it and update the data in requirements.txt

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