python – Pip Requirements.txt –global-option导致其他软件包的安装错误. “选项未被识别”
作者:互联网
我对requirements.txt文件的–global-option和–install-option设置有困难.指定一个库的选项会导致其他库安装失败.
我正在尝试安装Python库“grab”和“pycurl”.我需要指定pycurl安装选项:“ – with-nss”.我可以在完全干净的虚拟环境中复制错误.
在新的虚拟环境中,requirements.txt包含:
grab==0.6.25
pycurl==7.43.0 --install-option='--with-nss'
然后安装:
pip install -r requirements.txt
将发生以下错误.
Installing collected packages: lxml, pycurl, pytils, six, user-agent, weblib, selection, grab
Running setup.py install for lxml ... done
Running setup.py install for pycurl ... done
Running setup.py install for pytils ... error
Complete output from command /home/ec2-user/test/env/bin/python2.7 -u -c "import setuptools, tokenize;__file__='/tmp/pip-build-8GvFzA/pytils/setup.py';exec(compile(getattr(tokenize, 'open', open)(__file__).read().replace('\r\n', '\n
'), __file__, 'exec'))" install --record /tmp/pip-BCG3Wl-record/install-record.txt --single-version-externally-managed --compile --install-headers /home/ec2-user/test/env/include/site/python2.7/pytils --with-nss:
usage: -c [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]
or: -c --help [cmd1 cmd2 ...]
or: -c --help-commands
or: -c cmd --help
error: option --with-nss not recognized
----------------------------------------
Command "/home/ec2-user/test/env/bin/python2.7 -u -c "import setuptools, tokenize;__file__='/tmp/pip-build-8GvFzA/pytils/setup.py';exec(compile(getattr(tokenize, 'open', open)(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))"
install --record /tmp/pip-BCG3Wl-record/install-record.txt --single-version-externally-managed --compile --install-headers /home/ec2-user/test/env/include/site/python2.7/pytils --with-nss" failed with error code 1 in /tmp/pip-build-8GvF
zA/pytils/
我最好的猜测是根本原因是选项“–with-nss”被传递给所有需要pycurl的库,并阻止安装.即使pycurl安装工作正常,pytils安装也会失败.
反正只有将安装选项传递给一个库?
我在Amazon Elastic Beanstalk实例上进行设置,因此没有选项可以手动运行requirements.txt文件的每一行 – 整个安装在应用程序启动时运行.
–global-option和–install-option的源代码(我认为不应该这样做):
How to maintain pip install options in requirements file made by pip freeze?
https://github.com/pypa/pip/blob/develop/docs/reference/pip_install.rst#id28
解决方法:
你的问题来自这样一个事实:带有EB的EC2上的PIP版本很老,并且不了解你的选择.
>使用EB命令将pip lib更新为最新可用版本:
PROJECT_DIR / .ebextensions / 02-python.config:
...
commands:
01_upgrade_pip_for_venv:
command: "/opt/python/run/venv/bin/pip install --upgrade pip"
...
>现在您可以在requirements.txt中保留选项,因为新版本的pip将能够使用它.
PROJECT_DIR / requirements.txt:
...
pycurl==7.43.0 --global-option="--with-nss"
...
>(这可能是多余的)在EB控制台用户界面中设置选项或通过eb CLI使用命令设置:
eb setenv PYCURL_SSL_LIBRARY = nss
>将更改推送到存储库并重建.您可能会遇到错误,因为执行是从外部作用域控制的,并且是从旧版本的PIP开始的.执行的入口点在EC2实例上的应用程序之外,所以我不确定如何在第一次部署时提供可以从钩子范围起作用的解决方案……但是你要做的就是再次部署,它将使用正确的PIP的版本,所以它从现在开始工作,直到下一次重建……
标签:pycurl,python,pip,requirements-txt 来源: https://codeday.me/bug/20191002/1843036.html