Domanda

Sto lavorando con Fabric (0.9.4)+PIP (0.8.2) e devo installare alcuni moduli Python per più server. Tutti i server hanno una vecchia versione di SetUpTools (0.6C8) che devono essere aggiornati per il modulo PyMongo. PyMongo richiede setUptOols> = 0.6C9.

Il mio problema è che PIP avvia l'installazione con PyMongo invece di setUptOols che fa fermare PIP. L'ordine del modulo mescolato nel file dei requisiti non sembra aiutare.

Requisiti.txt:

setuptools>=0.6c9
pymongo==1.9
simplejson==2.1.3

C'è un modo per specificare l'ordine di installazione per PIP in quanto non sembra farlo correttamente da solo?

Questo può essere risolto con due file di requisiti separati, ma sarebbe bello se non avessi bisogno di mantenere più file di requisiti ora o in futuro.

Il problema persiste con PIP 0.8.3.

È stato utile?

Soluzione

Questo è un hack stupido, ma potrebbe funzionare. Scrivi uno script bash che legge dalla riga del file requisiti per riga ed esegue il comando PIP su di esso.

#!/bin/bash
for line in $(cat requirements.txt)
do
  pip install $line -E /path/to/virtualenv
done

Altri suggerimenti

Puoi semplicemente usare:

cat requirements.txt | xargs pip install

Per consentire a tutti i tipi di voci (ad esempio pacchetti dai repository Git) nei requisiti.

cat requirements.txt | xargs -n 1 -L 1 pip install

-n 1 e -L 1 Sono necessarie opzioni per installare i pacchetti uno per uno e trattare ogni riga nel file requisiti.txt come elemento separato.

Purtroppo il suggerimento di aggiornamento non funzionerà. Se leggi gli altri dettagli in https://github.com/pypa/pip/issues/24 vedrai perché

PIP costruirà prima tutti i pacchetti, prima di tentare di installarli. Quindi, con un file di requisiti come il seguente

numpy==1.7.1
scipy==0.13.2
statsmodels==0.5.0

La costruzione di statsmodel fallirà con la seguente dichiarazione

ImportError: statsmodels requires numpy

La soluzione alternativa fornita per chiamare manualmente PIP per ciascuna voce nel file dei requisiti (tramite uno script di shell) sembra essere l'unica soluzione corrente.

PyMongo richiede setUptOols> = 0.6c9

Come lo sai? Richiede di costruire o installare? Non dici quale versione di Pymongo stavi cercando di installare ma guardando setup.py File per la versione corrente (3.2.2) Non esiste alcuna specifica di ciò che Pympyongo richiede per eseguire setup.py (setup_requires) né ciò che richiede per installare (install_requires). Senza tali informazioni, PIP non può garantire una versione specifica di setupTools. Se PyMongo richiede una versione specifica di setuptools per eseguire setup.py (invece di richiedere il funzionamento di setuptup setup funzione stessa) quindi l'altro problema è che fino a poco tempo fa non c'era modo di specificarlo. Ora ci sono specifiche - PEP 518 - Specificare i requisiti minimi di sistema di costruzione per i progetti Python, che dovrebbe essere implementato a breve in PIP - Implementa il supporto PEP 518 #3691.

Per quanto riguarda l'ordine di installazione, questo è stato fissato in PIP 6.1.0;

Da Installazione PIP - Ordine di installazione sezione della documentazione di Pip:

A partire da V6.1.0, PIP installa dipendenze prima delle loro persone a carico, cioè in "ordine topologico". Questo è l'unico impegno PIP attualmente correlato all'ordine.

E più tardi:

Prima di V6.1.0, PIP non ha preso impegni sull'ordine di installazione.

Tuttavia, senza le specifiche adeguate dei requisiti da parte di PyMongo non aiuterà neanche.

A seguito della soluzione di @Lukasrms-Ho dovuto farlo per far sì che PIP installasse le mie esigenze da una volta:

cat requirements.txt | xargs -n 1 pip install

Se hai commenti nel tuo file di requisiti che vorrai utilizzare:

grep -v "^#" requirements.txt | xargs pip install

Ho finito per eseguire PIP all'interno di VirtualEnv invece di usare "PIP -E" perché con -e Pip poteva ancora vedere i pacchetti di siti dei server e questo ovviamente ha incasinato alcune installazioni.

Ho anche avuto problemi con i server senza virtuali. Anche se avessi installato setUptOols con comando PIP separato Pympyongo si rifiuterebbe di essere installato.

L'ho risolto installando setupTools separatamente con easy_install in quanto questo sembra essere un problema tra PIP e setUptOols.

frammenti da fabfile.py:

env.activate = "source %s/bin/activate" % virtualenv_path

_virtualenv("easy_install -U setuptools")
_virtualenv("pip install -r requirements.txt")

def _virtualenv(command)
    if env.virtualenv:
        sudo(env.activate + "&&" + command)
    else:
        sudo(command)

Ho avuto questi problemi con PIP 0.8.3 e 0.8.2.

Mi dispiace, la mia prima risposta è stata sbagliata, perché avevo setupTools> = 0.6C9.

Sembra che non sia possibile perché il setup.py di PyMongo necessita di setUptOols> = 0.6c9, ma PIP ha scaricato solo setuptools> = 0.6c9 e non ancora installato.

Qualcuno ne ha discusso nella questione che ho indicato prima.

Ho creato il mio problema alcune settimane fa: Non correre egg_info a ciascun pacchetto nell'elenco dei requisiti prima di installare i pacchetti precedenti.

Scusa per il rumoroso.


Prima risposta:

Aggiorna il tuo PIP alla versione 0.8.3, ha a Bugfix to Installation Order.

Ora se aggiorni tutto funziona :-)

Controlla le notizie qui: http://www.pip-installer.org/en/0.8.3/news.html

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top