2016-03-31 2 views
7

Je rencontre des difficultés avec les paramètres --global-option et --install-option d'un fichier requirements.txt. La spécification des options pour une bibliothèque entraîne l'échec des autres installations de bibliothèques. J'essaie d'installer les bibliothèques Python "grab" et "pycurl". Je dois spécifier que pycurl soit installé avec l'option: "--with-nss". Je peux reproduire l'erreur sur un environnement virtuel complètement propre.Pip Requirements.txt --global-option entraînant des erreurs d'installation avec d'autres packages. "option not recognized"

Sur un nouvel environnement virtuel avec requirements.txt contenant:

grab==0.6.25 
pycurl==7.43.0 --install-option='--with-nss' 

ensuite avec l'installation:

pip install -r requirements.txt 

Les erreurs suivantes se produiront.

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/ 

Ma meilleure estimation à la cause fondamentale est que l'option « --with-nss » est transmis à toutes les bibliothèques qui nécessitent pycurl, et empêcher l'installation. L'installation de pytils échoue même si l'installation de pycurl fonctionne correctement.

Y a-t-il un moyen de transmettre uniquement les options d'installation à la bibliothèque?

Je configure ceci sur une instance Amazon Elastic Beanstalk, donc il n'y a pas d'option pour exécuter manuellement chaque ligne du fichier requirements.txt - l'installation entière est exécutée au démarrage de l'application.

Sources pour --global-option et l'option --install-(qui je pense ne devrait pas le faire): 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

Répondre

8

Votre problème vient du fait que la version PIP sur EC2 avec EB est assez vieux et ne comprend pas vos options.

  1. Mise à jour pip lib à la dernière version disponible avec les commandes EB:

project_dir/.ebextensions/02-python.config:

... 
commands: 
    01_upgrade_pip_global: 
    command: "pip install --upgrade pip" 
    02_upgrade_pip_for_venv: 
    command: "sudo /opt/python/run/venv/bin/pip install --upgrade pip" 
... 
  1. Vous pouvez maintenant laisser des options dans le fichier requirement.txt car une nouvelle version de pip pourra fonctionner avec.

project_dir/requirements.txt:

... 
pycurl==7.43.0 --global-option="--with-nss" 
... 
  1. (Cela peut être redondant) Définir l'option dans les interfaces utilisateur de la console EB ou par eb CLI avec la commande:

    setenv eb PYCURL_SSL_LIBRARY = nss

  2. changements Push Repository Reconstruire. Vous pouvez avoir des erreurs puisque l'exécution est contrôlée depuis la portée externe et démarrée avec l'ancienne version de PIP. Le point d'entrée d'exécution est en dehors de l'application sur l'instance EC2, donc je ne suis pas sûr de savoir comment apporter une solution qui fonctionnerait à partir de la portée des hooks lors du premier déploiement ...Mais tout ce que vous avez à faire est de déployer à nouveau, et il utilisera la bonne version de PIP, de sorte qu'il fonctionne à partir de maintenant, jusqu'à la prochaine reconstruction ...