Installare un pacchetto Python in una directory diversa usando pip?


435

So che la risposta ovvia è usare virtualenv e virtualenvwrapper, ma per vari motivi non posso / non voglio farlo.

Quindi, come posso modificare il comando

pip install package_name

fare pipinstallare il pacchetto in un posto diverso da quello predefinito site-packages?



2
Ora domanda numero due: quando si sta già installando in una directory personalizzata, come fare in modo di pipNON provare a rimuovere una versione precedente da una directory non personalizzata. Ad esempio, a livello di sistema, in cui non si dispone di autorizzazioni di scrittura. Finora l'ho fatto solo con easy_install...
Tomasz Gandor,

2
@TomaszGandor Penso che l'utilizzo --ignore-installeddell'opzione dovrebbe impedire a pip di tentare di disinstallare i pacchetti già installati.
Piotr Dobrogost,

scusate il fatto che io sia nuovo con pip, ma la vostra domanda equivale a chiedere "come fare per installare pi su una versione diversa di Python"? Ho Python 3.4 e 3.5 ma voglio che le mie installazioni pip vadano su Python 3.5.
Charlie Parker,

@ Charlie Nope, domanda diversa. Non so abbastanza della tua installazione / intenzioni, ma in generale probabilmente userei virtualenvwrapper e creerei un ambiente virtuale con qualcosa del generemkvirtualenv --python=/usr/bin/python3.5 env_name
Monika Sulik

Risposte:


334

Uso:

pip install --install-option="--prefix=$PREFIX_PATH" package_name

È inoltre possibile utilizzare --ignore-installedper forzare la reinstallazione di tutte le dipendenze utilizzando questo nuovo prefisso. Puoi usarlo --install-optionpiù volte per aggiungere una qualsiasi delle opzioni con cui puoi usare python setup.py install( --prefixè probabilmente quello che vuoi, ma ci sono molte altre opzioni che potresti usare).


5
se lo fai, c'è un modo pip freezeper vedere la directory alternativa?
Russ,

7
pip freeze guarda sul percorso, quindi se qualcosa del genere PYTHONPATH=$PREFIX_PATH/lib/python2.6/site-packages pip freezedovrebbe vederli.
Ian Bicking,

4
L'uso --prefix=$PREFIX_PATHnon sembra consentire il pieno controllo della directory di installazione in quanto è stato aggiunto un suffisso specifico del sistema ( \Lib\site-packagesad esempio su Windows). C'è un modo per specificare una directory specifica?
Piotr Dobrogost,

1
@Piotr: sì, c'è la mia risposta. Usare '--prefix' è un po 'approssimativo, ma funziona bene se vuoi che il tuo puro pitone vada sotto /usr/lib/pythonX.Y/site-packages invece di /usr/local/lib/pythonX.Y/site- pacchi.
Anthon,

80
Non è una cattiva risposta 4 anni fa, ma l'opzione --target esiste ora.
Tritium21

545

L' opzione --target è ciò che stai cercando:

pip install --target=d:\somewhere\other\than\the\default package_name

Ma devi ancora aggiungere d:\somewhere\other\than\the\defaulta PYTHONPATHper usarli effettivamente da quella posizione.

-t, --target <dir>
Installa i pacchetti in <dir>. Per impostazione predefinita, questo non sostituirà i file / le cartelle esistenti in <dir>.
Utilizzare --upgrade per sostituire i pacchetti esistenti in <dir> con nuove versioni.


Aggiorna pip se l'interruttore target non è disponibile:

Su Linux o OS X:

pip install -U pip

Su Windows (risolve un problema ):

python -m pip install -U pip

8
@DanH run pip install --upgrade pip!
r3m0t

16
Questa è la vera risposta, è solo che l'opzione è stata aggiunta un po 'dopo la risposta accettata.
bukzor,

5
Qual è la differenza tra --install-option="--prefix=$PREFIX_PATH"menzionata da @Ian Bicking e l' --target=$PATHopzione?
Hibou57,

6
targetè un'opzione pip e tutto ciò che hai inserito install-optionverrà passato al file setup.py install command. Fondamentalmente targetè la posizione dei pacchetti di siti personalizzati.
Janusz Skonieczny,

10
L'uso --targetpotrebbe comportare un'installazione parziale, poiché non installerà alcun script / file di dati incluso nel prefisso specificato. Sembra che passare --prefixcon --install-optionsia l'unico modo corretto per avere il pieno controllo sul prefisso delle installazioni utilizzate.
Kenneth Hoste,

74

Invece --targetdell'opzione o --install-optionsdell'opzione, ho scoperto che quanto segue funziona bene (dalla discussione su un bug relativo a questa cosa su https://github.com/pypa/pip/issues/446 ):

PYTHONUSERBASE=/path/to/install/to pip install --user

(Oppure imposta la PYTHONUSERBASEdirectory nel tuo ambiente prima di eseguire il comando, utilizzando export PYTHONUSERBASE=/path/to/install/to)

Questo utilizza il molto utile --useropzione, ma dice che per fare i bin, lib, sharee altre directory che ci si aspetta in un prefisso personalizzato piuttosto che $HOME/.local.

Poi si può aggiungere questo ai tuoi PATH, PYTHONPATHe altre variabili, come si farebbe con una normale directory di installazione.

Si noti che potrebbe anche essere necessario specificare le opzioni --upgradee --ignore-installedse eventuali pacchetti da cui dipende richiedono l'installazione di versioni più recenti nella PYTHONUSERBASEdirectory, per sovrascrivere le versioni fornite dal sistema.

Un esempio completo:

PYTHONUSERBASE=/opt/mysterypackage-1.0/python-deps pip install --user --upgrade numpy scipy

..per installare scipye numpyimpacchettare le versioni più recenti in una directory che puoi quindi includere nel tuo PYTHONPATHlike (usando bash e per python 2.6 su CentOS 6 per questo esempio):

export PYTHONPATH=/opt/mysterypackage-1.0/python-deps/lib64/python2.6/site-packages:$PYTHONPATH
export PATH=/opt/mysterypackage-1.0/python-deps/bin:$PATH

L'uso di virtualenv è ancora una soluzione migliore e più ordinata!


4
Funzionava con Travis CI in esecuzione su contenitori Docker mentre la soluzione --install-option = "- prefix = $ PREFIX_PATH" non funzionava.
32 bit

1
Noobie domanda, quanto è importante la /bincartella pip crea, --usercrea come fa --PREFIXmentre --targetnon lo fa.
Jonathan,

1
Se il pacchetto è installato in Python globale, --ignore-installedè necessario.
George Sovetov,

1
Questa opzione è anche compatibile con --editableinstallazioni locali.
mdh,

1
Questa opzione è utile per l'installazione di pacchetti come superutente per un altro utente non root senza doverlo suaggirare (il che può essere problematico nei container, per esempio).
mdh,

43

L'installazione di un pacchetto Python spesso include solo alcuni file Python puri. Se il pacchetto include dati, script e / eseguibili, questi vengono installati in directory diverse dai file Python puri.

Supponendo che il tuo pacchetto non abbia dati / script / eseguibili e che tu voglia che i tuoi file Python vadano /python/packages/package_name(e non qualche sottodirectory alcuni livelli sotto /python/packagescome quando lo usi --prefix), puoi usare il comando one time:

pip install --install-option="--install-purelib=/python/packages" package_name

Se vuoi che tutti (o la maggior parte) dei tuoi pacchetti vadano lì, puoi modificarli ~/.pip/pip.confper includere:

[install]
install-option=--install-purelib=/python/packages

In questo modo non puoi dimenticare di doverlo specificare più volte.

Eventuali eseguibili / dati / script inclusi nel pacchetto andranno comunque nelle posizioni predefinite a meno che non si specifichino opzioni di installazione aggiuntive ( --prefix/ --install-data/ --install-scripts, ecc., Per i dettagli, consultare le opzioni di installazione personalizzate ).


1
Un grande vantaggio per il file di configurazione. Personalmente lo specifica --prefixlì, perché ho una directory "locale" su un server condiviso nella home directory, ed è stato usato come prefisso easy_installprima di passare a pip. Sistema $PATHe $PYTHONPATHsono stati configurati in precedenza. Invece di install-option=--install-purelib=/blahquesta nuova target=/blahopzione / switch. È anche bello, ma a volte è necessario solo un sostituto per --prefix, che useresti con setup.pyo easy_install.
Tomasz Gandor,


18

Nessuno sembra aver menzionato l'opzione -t ma quella più semplice:

pip install -t <direct directory> <package>

8
L' -topzione è la versione corta della --targetpossibilità che è stata descritta in un'altra risposta ( stackoverflow.com/a/19404371/594053 ) :)
MattiSG

14

Aggiungi un punto alla risposta di @Ian Bicking:

L'uso --userdell'opzione per specificare la directory installata funziona anche se si desidera installare un pacchetto Python nella propria directory home (senza diritto utente sudo) sul server remoto.

Per esempio,

pip install --user python-memcached

Il comando installerà il pacchetto in una delle directory elencate in PYTHONPATH.


14

Testate queste opzioni con python3.5 e pip 9.0.3:

pip install --target / myfolder [pacchetti]

Installa TUTTI i pacchetti comprese le dipendenze in / myfolder. Non tiene conto del fatto che i pacchetti dipendenti sono già installati altrove in Python. Troverai i pacchetti da / myfolder / [nome_pacchetto]. Nel caso in cui tu abbia più versioni di Python, questo non ne tiene conto (nessuna versione di Python nel nome della cartella del pacchetto).

pip install --prefix / myfolder [pacchetti]

I controlli sono dipendenze già installate. Installa i pacchetti in /myfolder/lib/python3.5/site-packages/[packages]

pip install --root / myfolder [pacchetti]

Controlla le dipendenze come --prefix ma il percorso di installazione sarà /myfolder/usr/local/lib/python3.5/site-packages/[package_name].

pip install --user [pacchetti]

Installa i pacchetti in $ HOME: /home/[USER[/.local/lib/python3.5/site-packages Python cerca automaticamente da questo percorso .local in modo da non doverlo inserire nel tuo PYTHONPATH.

=> Nella maggior parte dei casi, l'utente è l'opzione migliore da utilizzare. Nel caso in cui la cartella home non possa essere utilizzata per qualche motivo, allora --prefix.


In esecuzione su python 2.7.16, --target (o --prefix) installa Jinja2-2.10.1.dist-info / ad esempio, mentre install --install-option = "- il prefisso installa Jinja2-2.10.1-py2 .7.egg-info /, che è quello che volevo davvero
Greg Dougherty,

13

Le versioni più recenti di pip(8 o successive) possono utilizzare direttamente l' --prefixopzione :

pip install --prefix=$PREFIX_PATH package_name

dove si $PREFIX_PATHtrova il prefisso di installazione in cui sono posizionate lib, bin e altre cartelle di livello superiore.


10
pip install packageName -t pathOfDirectory

o

pip install packageName --target pathOfDirectorty

4

Per aggiungere al già buon consiglio, dato che avevo un problema con l'installazione di IPython quando non avevo i permessi di scrittura/usr/local .

pip usa distutils per fare la sua installazione e questo thread discute come ciò possa causare un problema in quanto si basa susys.prefix sull'impostazione.

Il mio problema si è verificato quando l'installazione di IPython ha provato a scrivere su '/ usr / local / share / man / man1' con Autorizzazione negata . Poiché l'installazione non è riuscita, non è stato possibile scrivere i file IPython nella directory bin.

Usando "--user" ha funzionato e i file sono stati scritti in ~ / .local. L'aggiunta di ~ / .local / bin a $ PATH mi ha permesso di usare "ipython" da lì.

Tuttavia sto cercando di installarlo per un numero di utenti e mi è stato dato il permesso di scrivere nella /usr/local/lib/python2.7directory. Ho creato una directory "bin" e ho impostato le direttive per distutils:

vim ~/.pydistutils.cfg

[install]
install-data=/usr/local/lib/python2.7
install-scripts=/usr/local/lib/python2.7/bin

quindi ( -Iviene utilizzato per forzare l'installazione nonostante i precedenti errori / installazione .local):

pip install -I ipython

Poi ho aggiunto /usr/local/lib/python2.7/bina $PATH.

Ho pensato di includerlo nel caso in cui altri abbiano problemi simili su una macchina a cui non hanno accesso sudo.


2

Se stai usando brew con python, sfortunatamente, pip / pip3 viene fornito con opzioni molto limitate. Non hai --install-option, --target, --user opzioni come menzionato sopra.

Nota su pip install --user
Il normale pip install --user è disabilitato per Python preparato. Questo a causa di un bug in distutils, perché Homebrew scrive un distutils.cfg che imposta il prefisso del pacchetto. Una possibile soluzione alternativa (che inserisce gli script eseguibili in ~ / Library / Python /./ bin) è: python -m pip install --user --install-option="--prefix=" <package-name>

Potresti trovare questa linea molto ingombrante. Suggerisco di usare pyenv per la gestione. Se stai usando

brew upgrade python python3

Ironia della sorte, in realtà si esegue il downgrade della funzionalità pip.

(Pubblico questa risposta, semplicemente perché pip nel mio mac osx non ha l'opzione --target e ho passato ore a ripararlo)


Questa risposta con un prefisso esplicito, e ignore-installedgrazie ai precedenti sforzi, ha funzionato per me:python -m pip install --user --install-option="--prefix='/myFunkyApp/lib'" --ignore-installed <package-name>
Jeremy Jones,

0

Con pip v1.5.6su Python v2.7.3(GNU / Linux), l'opzione --rootconsente di specificare un prefisso di installazione globale (apparentemente) indipendentemente dalle opzioni del pacchetto specifico. Prova fi,

$ pip install --root=/alternative/prefix/path package_name

0

Suggerisco di seguire la documentazione e creare il file ~ / .pip / pip.conf. Nota nella documentazione mancano la directory di intestazione specificata mancante, che porta al seguente errore:

error: install-base or install-platbase supplied, but installation scheme is incomplete

Il contenuto completo del file conf è:

[install]
install-base=$HOME
install-purelib=python/lib
install-platlib=python/lib.$PLAT
install-scripts=python/scripts
install-headers=python/include
install-data=python/data

Sfortunatamente posso installarlo, ma quando provo a disinstallare pip mi dice che non esiste un pacchetto simile per il processo di disinstallazione .... quindi qualcosa è ancora sbagliato ma il pacchetto va nella sua posizione predefinita.


0

pip install /path/to/package/

è ora possibile.

La differenza con questo e usando il flag -eo --editableè che si -ecollega a dove è salvato il pacchetto (cioè la cartella dei download), piuttosto che installarlo nel tuo percorso Python.

Questo significa che se elimini / sposti il ​​pacchetto in un'altra cartella, non sarai in grado di usarlo.


questo non risponde alla domanda
Clintm il

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.