DistutilsOptionError: deve fornire il prefisso home o prefisso / exec-non - entrambi


144

Di solito sono stato installato pacchetti Python tramite pip.

Per Google App Engine, devo installare i pacchetti in un'altra directory di destinazione.

Ho provato:

installazione pip -I flask-restful --target ./lib

ma fallisce con:

deve fornire home o prefisso / exec-prefix - non entrambi

Come posso farlo funzionare?

Risposte:


289

Stai usando OS X e Homebrew? La pagina di python di Homebrew https://github.com/Homebrew/brew/blob/master/docs/Homebrew-and-Python.md risolve un problema noto con pip e una soluzione.

Ha funzionato per me.

È possibile impostare questo "prefisso vuoto" come predefinito aggiungendo un file ~ / .pydistutils.cfg con i seguenti contenuti:

[install]
prefix=

Modifica: non utilizzare questa opzione Homebrew consigliata, interromperà le normali operazioni di pip .


5
roba buona, il link è cattivo, questo è quello nuovo che mi aspetto: github.com/Homebrew/homebrew/blob/master/share/doc/homebrew/…
patt0

6
Nota che quel file ha rotto l'ambiente virtuale per me.
Dmytro Sadovnychyi,

16
Questa attività di prefisso vuoto interrompe le normali pip installoperazioni :(
Jaap

10
qualcuno ha capito come permettere --target, mentre non rovinare predefinita pip installcomportamento?
Ryantuck,

3
Questo non sembra essere più valido. Il collegamento è interrotto e il collegamento aggiornato non parla di pydistutils.cfg
Lucretiel

164

Credo che ci sia una soluzione più semplice a questo problema (Homebrew's Python su macOS) che non interromperà le normali operazioni pip.

Tutto quello che devi fare è creare un setup.cfgfile nella directory principale del tuo progetto, di solito dove si trova il tuo __init__.pyfile py principale o eseguibile. Quindi se la cartella principale del tuo progetto è:, /path/to/my/project/crea un setup.cfgfile e inserisci le parole magiche all'interno:

[install]
prefix=  

OK, ora potresti essere in grado di eseguire i comandi di pip per quella cartella:

pip install package -t /path/to/my/project/  

Questo comando verrà eseguito correttamente per quella cartella. Copia setup.cfgin qualunque altro progetto tu possa avere. Non c'è bisogno di scrivere un .pydistutils.cfgnella tua home directory.

Al termine dell'installazione dei moduli, è possibile rimuoverli setup.cfg .


2
Questo ha funzionato perfettamente anche con pip3.6. E il mio pip è ancora intatto.
Annibale,

10
Questa dovrebbe essere la risposta accettata. Evita di causare problemi con le impostazioni globali del pip.
TrinitronX,

10
enfasi sulla parte rimuovi setup.cfgdopo l'installazione. Ho bruciato per 2 giorni interi cercando di capire perché il mio ambiente virtualenv era stato rovinato, con errori come Could not install packages due to an EnvironmentError: [Errno 1] Operation not permitted: '/bin/easy_install'. La rimozione del file di installazione ha ripristinato la mia sanità mentale
kip2 il

1
@ kip2 sì, giustamente notato da te, quindi ho modificato la risposta per enfatizzare quel punto, AndreG, per favore, nota.
bool.dev

Grazie per averlo notato. Sarebbe più corretto se dicessi "Dopo aver finito l'installazione dei moduli, è necessario rimuovere setup.cfg"?
AndreG

25

Su OSX (mac), assumendo una cartella di progetto chiamata / var / myproject

  1. cd /var/myproject
  2. Crea un file chiamato setup.cfge aggiungi [install] prefix=
  3. Correre pip install <packagename> -t .

1
Non sono sicuro di come sia diverso dalla risposta di @AndreG
Alastair McCormack,

La differenza per me è che questa soluzione viene inserita nella directory e -t .invece di rimanere fuori dalla directory . In questo modo ha funzionato per me e l'altro no, anche se non ho idea del perché.
Chuck Wilbur,

12

Un'altra soluzione * per gli utenti di Homebrew è semplicemente usare a virtualenv.

Naturalmente, ciò può rimuovere comunque la necessità della directory di destinazione, ma anche in caso contrario, ho trovato le --targetopere di default (come in, senza creare / modificare un file di configurazione) in un ambiente virtuale.


* Dico soluzione; forse è solo un'altra motivazione per usare meticolosamente venvs ...


3
Non riesco a credere che sia stato solo un mese fa. Mi sono sorpreso a rispondere alla mia domanda; prima del tempo ...
OJFord,

Quindi, recentemente ho avuto il problema nella domanda di OP, e semplicemente la creazione di un virtual risolto il problema per me. Potrei ancora installare nella directory di destinazione. Il mio problema è stato ulteriormente complicato perché ho installato anche python3, ma +1 per la soluzione virtualenv.
Josh Brown,

3

Ho riscontrato errori con le altre raccomandazioni in giro --install-option="--prefix=lib". L'unica cosa che ho scoperto che ha funzionato è usare PYTHONUSERBASEcome descritto qui .

export PYTHONUSERBASE=lib
pip install -I flask-restful --user

questo non è esattamente lo stesso di --target, ma fa comunque il trucco per me.


2

Come altri menzionato, questo è noto bug con pip & python installato con homebrew.

Se si crea un ~/.pydistutils.cfgfile con l'istruzione "prefisso vuoto" risolverà questo problema ma interromperà le normali operazioni pip.

Fino a quando questo bug non viene risolto ufficialmente, una delle opzioni sarebbe quella di creare il tuo script bash che gestisse questo caso:

 #!/bin/bash

 name=''
 target=''

 while getopts 'n:t:' flag; do
     case "${flag}" in
         n) name="${OPTARG}" ;;
         t) target="${OPTARG}" ;;
     esac
 done

 if [ -z "$target" ];
 then
     echo "Target parameter must be provided"
     exit 1
 fi

 if [ -z "$name" ];
 then
     echo "Name parameter must be provided"
     exit 1
 fi

 # current workaround for homebrew bug
 file=$HOME'/.pydistutils.cfg'
 touch $file

 /bin/cat <<EOM >$file
 [install]
 prefix=
 EOM
 # end of current workaround for homebrew bug

 pip install -I $name --target $target

 # current workaround for homebrew bug
 rm -rf $file
 # end of current workaround for homebrew bug

Questo script racchiude il tuo comando e:

  1. accetta i parametri nome e destinazione
  2. controlla se tali parametri sono vuoti
  3. crea il ~/.pydistutils.cfgfile con l'istruzione "prefisso vuoto" al suo interno
  4. esegue il comando pip con i parametri forniti
  5. rimuove il ~/.pydistutils.cfgfile

Questo script può essere modificato e adattato per soddisfare le tue esigenze ma ne hai idea. E ti consente di eseguire il comando senza frenare pip. Spero che sia d'aiuto :)


2

Se stai usando virtualenv *, potrebbe essere una buona idea ricontrollare which pipche stai utilizzando.

Se vedi qualcosa di simile /usr/local/bin/pipal tuo ambiente. La riattivazione di virtualenv risolverà questo problema:

vIRTUALENV: $ source bin/activate

VirtualFish: $ vf activate [environ]

*: Utilizzo virtualfish, ma presumo che questo suggerimento sia rilevante per entrambi.


usare virtualenv era in realtà la soluzione nel mio caso simile :)
chriscatfr,

-1

Ho un problema simile. Uso il flag --system per evitare l'errore mentre descrivo qui su un altro thread in cui spiego il caso specifico della mia situazione. Pubblico questo qui in attesa che possa aiutare chiunque si trovi ad affrontare lo stesso problema.

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.