我对requirements.txt文件的--global-option和--install-option设置有困难。指定一个库的选项会导致其他库安装失败。
我试图安装Python库"抓住"和" 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
答案 0 :(得分:8)
你的问题来自这样一个事实:带有EB的EC2上的PIP版本很老,并且不了解你的选择。
PROJECT_DIR / .ebextensions / 02-python.config:
...
commands:
01_upgrade_pip_for_venv:
command: "/opt/python/run/venv/bin/pip install --upgrade 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的版本,所以它从现在开始工作,直到下一次重建......