Combina --user con --prefix errore con l'installazione setup.py


103

Stavo cercando di installare pacchetti Python su un sistema a cui ho avuto accesso di recente. Stavo cercando di sfruttare la directory dei pacchetti del sito per utente relativamente nuova di Python e la nuova opzione --user. (L'opzione è attualmente non documentata , tuttavia esiste per Python 2.6+; puoi vedere la guida eseguendo python setup.py install --help.)

Quando ho provato a correre

python setup.py install --user

su qualsiasi pacchetto scaricato, ho sempre ricevuto il seguente errore:

error: can't combine user with with prefix/exec_prefix/home or install_(plat)base

L'errore è stato estremamente perplessi perché, come si può vedere, non stava fornendo il --prefix, --exec-prefix, --install-base, o --install-platbasebandiere come opzioni della riga di comando. Ho perso molto tempo cercando di capire quale fosse il problema. Documento la mia risposta di seguito, nella speranza di risparmiare qualche altra povera anima qualche ora di rasatura degli yak .


2
Ho ricevuto lo stesso errore provando a installare python 3.6 dalla sorgente con ./configure --prefix=${HOME}"user = 1" in ~/.pydistutils.cfg. In tal caso, ho bisogno di commentare temporaneamente "user = 1" in modo che il processo di installazione possa essere completato.
bli

bli ha dato un buon suggerimento. Mi chiedevo da dove provenga l'opzione --user anche se non l'ho usata. installazione pip --prefix / home / myhomedir. Non ho il file ~ / .pydistutils.cfg, sto ancora cercando dove è impostata l'opzione --user.
Kemin Zhou

Individua la fonte del problema. Questo è specifico di Debian. Dopo aver aggiunto l'opzione --system per pip il problema è andato via.
Kemin Zhou

Risposte:


161

Soluzione temporanea:

pip install --user --install-option="--prefix=" <package_name>

o

python setup.py install --user --prefix=

Nota che non c'è testo (nemmeno spazi bianchi) dopo il =.

Da non dimenticare la --userbandiera.

Installazione di più pacchetti:

Crea ~/.pydistutils.cfg(o equivalente per il tuo sistema operativo / piattaforma) con i seguenti contenuti:

[install]
prefix=

Nota che non c'è testo (nemmeno spazi bianchi) dopo il =.

Quindi esegui i comandi necessari pip install --usero python setup.py install --user. Da non dimenticare la --userbandiera.

Infine, rimuovi o rinomina questo file. Lasciare questo file presente causerà problemi durante l'installazione di pacchetti Python a livello di sistema (cioè senza --user) come questo utente con this ~/.pydistutils.cfg.

La causa di questo problema

Questo sembra essere un problema sia con OpenSUSE che con RedHat, che ha portato a un bug in virtualenv su queste piattaforme.

L'errore deriva da un file di configurazione di distutils a livello di sistema (nel mio caso /usr/lib64/python2.6/distutils/distutils.cfg) in cui era presente

[install]
prefix=/usr/local

Fondamentalmente, questo equivale a eseguire sempre il comando install come install --prefix=/usr/local. È necessario sovrascrivere questa specifica utilizzando una delle tecniche sopra.


1
Grazie mille. Il prefisso vuoto ha risolto il mio problema: pip 1.1 openSuSE 11.4.
guettli

6
Puoi anche passare un --prefix = vuoto a setup.py nella riga di comando per sovrascrivere il valore in distutils.cfg a livello di sistema
Tuxdude

2
Wow! Questo ha funzionato anche per me. Ho ricevuto lo stesso errore durante il tentativo di installare Powerline. powerline.readthedocs.org/en/latest/installation/…
A-Dubb

4
A pensarci bene, fare questo causerà GRANDI problemi. NON tenere questo file in giro. Consulta brew doctor per maggiori informazioni (supponendo che tu stia utilizzando homebrew su Mac OS X).
A-Dubb

1
Nota che mantenere questo file in questo modo farà pensare a Python che / sia la tua directory principale della libreria Python, causando problemi di confusione se provi a installare altri nuovi pacchetti.
rogueleaderr

6

Come è stato notato nei commenti, la risposta accettata (da @gotgenes, che, presumibilmente, ha i geni) può portare a conseguenze inaspettate.

@rogeleaderr dice: "Nota che mantenere questo file in questo modo farà pensare a Python che / è la tua directory principale della libreria Python, causando problemi di confusione se provi a installare altri nuovi pacchetti."

Invece di scrivere un nuovo file di configurazione, come consiglia @gotgenes, un'opzione migliore è aggiungere --prefix= (senza testo a destra del segno di uguale) come opzione sulla riga di comando , come in

$ python setup.py install --user --prefix=

5

Pubblicare post per risparmiare tempo agli altri, poiché nessuna risposta disponibile ha funzionato per me ...

In alcuni ambienti, utilizzando l'opzione --target( -t) si verificherà ancora lo stesso errore. Durante i miei test su due versioni di Linux, ho riscontrato lo stesso problema durante l'utilizzo del --prefix=parametro.

Codice:

PYTHONUSERBASE=/tmp/ pip install --user --force-reinstall $PACKAGE

Spiegazione: la mia soluzione alternativa, che sembra funzionare in molti ambienti (MacOS, Amazon Linux, Debian) è impostare la PYTHONUSERBASEvariabile di ambiente su una posizione temporanea. --force-reinstallviene utilizzato per attivare l'installazione locale anche quando il pacchetto è già installato.

Ciò comporterà la compilazione / installazione del modulo (a seconda del sistema operativo e della versione di Python) per: /tmp/lib/python2.7/site-packages/*


0

Puoi semplicemente eseguire pip install --user ., nessun argomento prefisso richiesto.

Questo è comunque meglio perché verrà impostato su python3 se il tuo pip è configurato per usare Python 3. (Ho dimenticato di entrare python3 setup.pye ha installato un pacchetto solo 3 sotto 2.7)

(credito https://stackoverflow.com/a/1550235/4364036 )


0

Ho avuto lo stesso problema. Era nascosto all'interno del ~/.config/pip/pip.confcon:

[global]
target=/foo/bar

Tale configurazione è stata creata da uno script di terze parti a mia insaputa.

Suggerisco di controllare i file di configurazione di pip e di rimuovere le target=/foo/baropzioni.

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.