2016-03-31 19 views
7

Sono in difficoltà con le opzioni --global-option e --install-option per un file requirements.txt. Se si specificano le opzioni per una libreria, le installazioni di altre librerie falliscono.Pip Requirements.txt --global-option che causa errori di installazione con altri pacchetti. "opzione non riconosciuta"

Sto cercando di installare le librerie Python "grab" e "pycurl". Devo specificare che pycurl sia installato con l'opzione: "--with-nss". Posso replicare l'errore su un ambiente virtuale completamente pulito.

In un nuovo ambiente virtuale Con requirements.txt contenente:

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

Poi installazione con:

pip install -r requirements.txt 

si verificano i seguenti errori.

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/ 

La mia ipotesi migliore presso la causa principale è che l'opzione "--with-NSS" è stato passato a tutte le librerie che richiedono pycurl, e prevenire l'installazione. L'installazione di pytils fallisce anche se l'installazione di pycurl funziona correttamente.

È comunque necessario passare solo le opzioni di installazione all'unica libreria?

L'ho impostato su un'istanza Amazon Elastic Beanstalk, quindi non è possibile eseguire manualmente ciascuna riga del file requirements.txt: l'intera installazione viene eseguita all'avvio dell'applicazione.

Fonti per --global-option e --install-opzione (che credo non dovrebbe farlo): 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

risposta

8

Il tuo problema deriva dal fatto che la versione PIP su EC2 con EB è abbastanza vecchio e non capisce le tue opzioni.

  1. Aggiornamento lib pip alla versione più recente disponibile con EB comandi:

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. Ora puoi lasciare le opzioni in required.txt dato che la nuova versione di pip sarà in grado di lavorare con esso.

project_dir/requirements.txt:

... 
pycurl==7.43.0 --global-option="--with-nss" 
... 
  1. (Questo può essere ridondante) opzione Imposta in EB interfacce utente console o di EB CLI con il comando:

    eb setenv PYCURL_SSL_LIBRARY = NSS

  2. modifiche push al repository e ricostruire. Potresti avere degli errori poiché l'esecuzione è controllata da un ambito esterno e iniziata con la vecchia versione di PIP. Il punto di ingresso di esecuzione è esterno all'app sull'istanza EC2 quindi non sono sicuro di come portare una soluzione che funzioni dall'ambito di hook sulla prima distribuzione ...Ma tutto ciò che dovete fare è di distribuire nuovamente, e userà la versione corretta di PIP, quindi funzionerà da ora in poi, fino alla prossima ricostruzione ...