我正在安装requirements.txt中的包
pip install -r requirements.txt
requirements.txt文件显示:
Pillow
lxml
cssselect
jieba
beautifulsoup
nltk
lxml是唯一一个安装失败的软件包,这导致了所有的失败(如Larsks在评论中指出的预期结果)。但是,在lxml失败后,pip仍然运行并下载其余的包。
据我所知,如果requirements.txt中列出的任何软件包安装失败,pip install -r requirements.txt命令将失败。
在运行pip install -r requirements.txt时,有没有什么可以说服它安装它能安装的东西,跳过它不能安装的包,或者在它看到失败时立即退出的理由?
从requirements.txt中删除lxml
谢谢,在这种情况下这是可行的,但总的来说,有什么办法可以解决这个问题吗?或者只是运行这个命令,看到它失败,然后删除包列表,这是正常的吗?
如果一个包列在requirements.txt中,那么它可能是必需的,因此,如果无法安装该包,pip将失败是合理的。如果代码在没有这个包的情况下运行,那么这几乎不是一个要求。从requirements.txt中随机删除失败的包似乎只会导致缺少依赖项的问题。
伟大的观点。会是这种行为的一个很好的理由。
使用pip install运行每条线路可能是一种解决方案。
cat requirements.txt | xargs -n 1 pip install
注:MacOS下没有-a参数,所以旧的cat更便于携带。
Mac:cat requirements.txt | xargs -n 1 pip install
我必须这样做:cat requirements.txt | cut -f1 -d"#" | sed '/^\s*$/d' | xargs -n 1 pip install删除评论中的任何内容,去掉空行。
至少在gnu xargs中,有-a标志选项,它允许xargs从文件中读取参数,所以这可以作为xargs -n 1 -a requirements.txt pip install来完成。防止UOOC和过度管道
对于Windows:PIP版本>=18
import sys
from pip._internal import main as pip_main
def install(package):
pip_main(['install', package])
if __name__ == '__main__':
with open(sys.argv[1]) as f:
for line in f:
install(line)
PIP版本< 18
import sys
import pip
def install(package):
pip.main(['install', package])
if __name__ == '__main__':
with open(sys.argv[1]) as f:
for line in f:
install(line)
xargs解决方案可以工作,但可能存在可移植性问题(BSD/GNU),并且/或者如果您的需求文件中有注释或空行,那么会很麻烦。
对于需要这种行为的用例,我使用两个单独的需求文件,一个只列出需要始终安装的核心依赖项,另一个具有非核心依赖项的文件占大多数用例不需要的90%。这相当于debian包的Recommends部分。
我使用以下shell脚本(需要sed来安装可选的依赖项:
#!/bin/sh
while read dependency; do
dependency_stripped="$(echo"${dependency}" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')"
# Skip comments
if [[ $dependency_stripped == \#* ]]; then
continue
# Skip blank lines
elif [ -z"$dependency_stripped" ]; then
continue
else
if pip install"$dependency_stripped"; then
echo"$dependency_stripped is installed"
else
echo"Could not install $dependency_stripped, skipping"
fi
fi
done < recommends.txt
谢谢,Etienne Prothon为Windows案件。
但是,在升级到pip 18之后,pip包不会向公众公开main。所以您可能需要像这样更改代码。
# This code install line by line a list of pip package
import sys
from pip._internal import main as pip_main
def install(package):
pip_main(['install', package])
if __name__ == '__main__':
with open(sys.argv[1]) as f:
for line in f:
install(line)
此解决方案处理Requirements.txt中的空行、空白行、注释行、空白然后注释行。
cat requirements.txt | sed -e '/^\s*#.*$/d' -e '/^\s*$/d' | xargs -n 1 pip install
这是SED魔术的答案。
您对lxml的使用有要求吗?它们在这里安装:
sudo apt-get install libxml2-dev libxslt-dev python-dev
如果您使用Windows或Mac,也可以进行检查。或者,设置static_deps=true将自动下载并构建两个库。(c)http://lxml.de/installation.html