DistutilsOptionError: muss entweder Home oder Präfix / Exec-Präfix angeben - nicht beide

144

Ich habe normalerweise Python-Pakete über pip installiert.

Für Google App Engine muss ich Pakete in einem anderen Zielverzeichnis installieren.

Ich habe es versucht:

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

aber es scheitert mit:

muss entweder home oder prefix / exec-prefix angeben - nicht beides

Wie kann ich das zum Laufen bringen?

Arkind
quelle

Antworten:

289

Verwenden Sie OS X und Homebrew? Die Homebrew-Python-Seite https://github.com/Homebrew/brew/blob/master/docs/Homebrew-and-Python.md weist auf ein bekanntes Problem mit pip und eine Problemumgehung hin.

Hat für mich gearbeitet.

Sie können dieses "leere Präfix" zum Standard machen, indem Sie eine ~ / .pydistutils.cfg-Datei mit dem folgenden Inhalt hinzufügen:

[install]
prefix=

Bearbeiten: Verwenden Sie diese von Homebrew empfohlene Option nicht, da dies den normalen Pip-Betrieb unterbricht .

Ayvazj
quelle
5
Gutes Zeug, der Link ist schlecht, dies ist der neue, den ich erwarte: github.com/Homebrew/homebrew/blob/master/share/doc/homebrew/…
patt0
6
Beachten Sie, dass diese Datei die virtuelle Umgebung für mich beschädigt hat.
Dmytro Sadovnychyi
16
Dieses leere Präfix-Geschäft bricht den normalen pip installBetrieb :(
Jaap
10
jemand herausgefunden, wie zu ermöglichen , hat --targetwährend nicht Standard ruinieren pip installVerhalten?
Ryantuck
3
Dies scheint nicht mehr gültig zu sein. Der Link ist defekt und der aktualisierte Link spricht nicht über pydistutils.cfg
Lucretiel
164

Ich glaube, es gibt eine einfachere Lösung für dieses Problem (Homebrews Python unter MacOS), die Ihre normalen Pip-Operationen nicht unterbricht.

Alles, was Sie tun müssen, ist, eine setup.cfgDatei im Stammverzeichnis Ihres Projekts zu erstellen , normalerweise dort, wo sich Ihre Haupt- __init__.pyoder ausführbare py-Datei befindet. Wenn der Stammordner Ihres Projekts: lautet /path/to/my/project/, erstellen Sie dort eine setup.cfgDatei und fügen Sie die magischen Wörter ein:

[install]
prefix=  

OK, jetzt können Sie die Befehle von pip für diesen Ordner ausführen:

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

Dieser Befehl wird nur für diesen Ordner ordnungsgemäß ausgeführt. Kopieren setup.cfgSie einfach in andere Projekte, die Sie möglicherweise haben. Sie müssen kein in .pydistutils.cfgIhr Home-Verzeichnis schreiben .

Nachdem Sie die Module installiert haben, können Sie sie entfernen setup.cfg .

AndreG
quelle
2
Dies funktionierte auch perfekt mit pip3.6. Und mein Pip ist noch intakt.
Hannibal
10
Dies sollte die akzeptierte Antwort sein. Vermeidet Probleme mit globalen Pip-Einstellungen.
TrinitronX
10
Schwerpunkt auf dem setup.cfgTeil nach dem Einbau entfernen . Ich habe 2 ganze Tage lang gebrannt, um herauszufinden, warum meine virtuelle Umgebung mit Fehlern wie verschraubt war Could not install packages due to an EnvironmentError: [Errno 1] Operation not permitted: '/bin/easy_install'. Das Entfernen der Setup-Datei stellte meine
geistige Gesundheit
1
@ kip2 Ja, zu Recht von Ihnen notiert, daher habe ich die Antwort bearbeitet, um dieses Bit hervorzuheben. AndreG, bitte beachten Sie.
bool.dev
Vielen Dank für die Notiz. Wäre es korrekter, wenn ich sagen würde "Nachdem Sie die Module installiert haben, sollten Sie setup.cfg entfernen"?
AndreG
25

Unter OSX (Mac) wird ein Projektordner mit dem Namen / var / myproject angenommen

  1. cd /var/myproject
  2. Erstellen Sie eine Datei mit dem Namen setup.cfgund fügen Sie hinzu [install] prefix=
  3. Lauf pip install <packagename> -t .
Jerome Anthony
quelle
1
Ich bin nicht sicher, wie sich dies von der Antwort von @AndreG unterscheidet
Alastair McCormack
Der Unterschied für mich ist, dass diese Lösungs-CD in das Verzeichnis aufgenommen wird und nicht -t .außerhalb des Verzeichnisses bleibt . Dieser Weg funktionierte für mich und der andere nicht, obwohl ich keine Ahnung habe warum.
Chuck Wilbur
12

Eine andere Lösung * für Homebrew-Benutzer ist einfach die Verwendung von a virtualenv.

Natürlich, das kann die Notwendigkeit für das Zielverzeichnis ohnehin entfernen - aber auch wenn es nicht der Fall ist, habe ich festgestellt --targetstandardmäßig funktioniert (wie in, ohne Erstellen / Ändern einer Konfigurationsdatei) , wenn sie in einer virtuellen Umgebung.


* Ich sage Lösung; Vielleicht ist es nur eine weitere Motivation, Venvs akribisch einzusetzen ...

OJFord
quelle
3
Ich kann nicht glauben, dass dies erst vor einem Monat war. Ich habe mich gerade dabei erwischt, meine eigene Frage zu beantworten. vor der Zeit ...
OJFord
Vor kurzem hatte ich das Problem in der Frage von OP, und nur das Erstellen einer virtuellen Umgebung löste das Problem für mich. Ich konnte immer noch in das Zielverzeichnis installieren. Mein Problem war zusätzlich kompliziert, weil ich auch python3 installiert habe, aber +1 für die virtualenv-Lösung.
Josh Brown
3

Ich habe Fehler mit den anderen Empfehlungen getroffen --install-option="--prefix=lib". Das einzige, was ich gefunden habe, das funktioniert hat, ist die Verwendung PYTHONUSERBASEwie hier beschrieben .

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

das ist nicht genau das gleiche wie --target, aber es macht auf jeden Fall den Trick für mich.

Imran Rashid
quelle
2

Wie bereits erwähnt, ist dies ein bekannter Fehler bei Pip & Python, der mit Homebrew installiert wurde.

Wenn Sie eine ~/.pydistutils.cfgDatei mit der Anweisung "leeres Präfix" erstellen , wird dieses Problem behoben, aber der normale Pip-Betrieb wird unterbrochen.

Bis dieser Fehler offiziell behoben ist, besteht eine der Optionen darin, ein eigenes Bash-Skript zu erstellen, das diesen Fall behandelt:

 #!/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

Dieses Skript umschließt Ihren Befehl und:

  1. akzeptiert Name und Zielparameter
  2. prüft, ob diese Parameter leer sind
  3. Erstellt eine ~/.pydistutils.cfgDatei mit der Anweisung "leeres Präfix"
  4. führt Ihren pip-Befehl mit den angegebenen Parametern aus
  5. entfernt die ~/.pydistutils.cfgDatei

Dieses Skript kann geändert und an Ihre Bedürfnisse angepasst werden, aber Sie bekommen eine Vorstellung davon. Und Sie können Ihren Befehl ausführen, ohne die Leitung zu bremsen. Ich hoffe es hilft :)

vs.
quelle
2

Wenn Sie virtualenv * verwenden, ist es möglicherweise eine gute Idee, Ihre Verwendung zu überprüfen which pip.

Wenn Sie so etwas sehen, als wären /usr/local/bin/pipSie aus Ihrer Umgebung ausgebrochen. Durch Reaktivieren Ihrer virtuellen Umgebung wird Folgendes behoben:

VirtualEnv: $ source bin/activate

VirtualFish: $ vf activate [environ]

*: Ich benutze Virtualfish, aber ich gehe davon aus, dass dieser Tipp für beide relevant ist.

Graham P Heath
quelle
mit virtualenv war eigentlich die lösung in meinem ähnlichen
fall
-1

Ich habe ein ähnliches Problem. Ich benutze das Flag --system , um den Fehler zu vermeiden, da ich hier in einem anderen Thread beschreibe, in dem ich den speziellen Fall meiner Situation erkläre. Ich poste dies hier in der Erwartung, dass es jedem helfen kann, der mit dem gleichen Problem konfrontiert ist.

Pipelog
quelle