pip installiert Pakete erfolgreich, aber ausführbare Dateien wurden nicht über die Befehlszeile gefunden

108

Ich arbeite an Mac OS X Yosemite, Version 10.10.3.

Ich habe Python2.7 und Pip mithilfe von Macport installiert, wie in http://johnlaudun.org/20150512-installing-and-setting-pip-with-macports/ beschrieben.

Ich kann Pakete erfolgreich installieren und in meine Python-Umgebung und Python-Skripte importieren. Eine mit einem Paket verknüpfte ausführbare Datei, die über die Befehlszeile im Terminal aufgerufen werden kann, wird jedoch nicht gefunden.

Weiß jemand, was falsch sein könnte? (Weitere Details unten)

Zum Beispiel während der Installation eines Pakets namens "rosdep", wie in http://wiki.ros.org/jade/Installation/Source beschrieben

Ich kann ausführen: sudo pip install -U rosdep welche fehlerfrei installiert wird und entsprechende Dateien sich in befinden/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages

Wenn ich jedoch versuche,: auszuführen sudo rosdep init, wird ein Fehler ausgegeben:"sudo: rosdep: command not found"

Dies ist kein paketspezifischer Fehler. Ich bekomme dies für jedes Paket, das mit pip auf meinem Computer installiert wurde. Ich habe sogar versucht hinzuzufügen

/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages

zu meinem $PATH. Die ausführbaren Dateien werden jedoch nicht in der Befehlszeile gefunden, obwohl die Pakete in Python einwandfrei funktionieren.

Sanket_Diwale
quelle
Ist eine virtuelle Umgebung beteiligt?
JL Peyret
Nein, es ist keine virtuelle Umgebung beteiligt.
Sanket_Diwale
Wenn Sie sudo, wechseln Sie zum $ PATH des Root-Benutzers.
Anthony Perot

Antworten:

47

Überprüfen Sie Ihren $ PATH

tox hat einen Befehlszeilenmodus:

audrey:tests jluc$ pip list | grep tox
tox (2.3.1)

wo ist es?

(edit: das 2.7Zeug spielt hier keine große Rolle, sub in any 3.xund pip verhält sich ziemlich gleich)

audrey:tests jluc$ which tox
/opt/local/Library/Frameworks/Python.framework/Versions/2.7/bin/tox

und was ist in meinem $ PATH?

audrey:tests jluc$ echo $PATH
/opt/chefdk/bin:/opt/chefdk/embedded/bin:/opt/local/bin:..../opt/local/Library/Frameworks/Python.framework/Versions/2.7/bin...

Beachten Sie die Datei /opt/local/Library/Frameworks/Python.framework/Versions/2.7/bin ? Das ist es, was es mir ermöglicht, meine mit Pip installierten Sachen zu finden

Nun, um zu sehen , wo die Dinge aus Python sind, versucht , dies zu tun (Ersatz rosdepfür tox).

$python
>>> import tox
>>> tox.__file__

das druckt aus:

'/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/tox/__init__.pyc'

Nun cd in das Verzeichnis , rechts oben libin der oben. Sehen Sie ein bin- Verzeichnis? Sehen Sie rosdepin diesem Mülleimer? Wenn ja, fügen Sie das binzu Ihrem $ PATH hinzu.

audrey:2.7 jluc$ cd /opt/local/Library/Frameworks/Python.framework/Versions/2.7
audrey:2.7 jluc$ ls -1

Ausgabe:

Headers
Python
Resources
bin
include
lib
man
share
JL Peyret
quelle
Danke JL für die Antwort, aber das ist hauptsächlich mein Problem. Für meine Beispiel-App rosdep, wenn ich wie Sie mache, ist hier die Ausgabe erhalten: pip list | grep rosdep rosdep (0.11.4) welche rosdep (keine Ausgabe), Kommandozeile gibt nichts zurück
Sanket_Diwale
1
Was nicht zurückkehrt, rosdepstimmt mit Ihrem Problem überein. Mein Punkt ist, dass Sie herausfinden müssen, wo das rosdepinstalliert ist und wie $ PATH aussieht.
JL Peyret
Vielen Dank, meine Binärdateien wurden auch in /opt/local/Library/Frameworks/Python.framework/Versions/2.7/bin installiert. Fügte das dem PFAD hinzu und jetzt funktioniert es. Vielen Dank, ich hatte Probleme beim Auffinden der Binärdateien, da keine Ausgabe bereitgestellt wurde.
Sanket_Diwale
export PATH = / opt / local / Library / Frameworks / Python.framework / Versions / 2.7 / bin: $ PATH fehlte auf meinen Pfaden und hat den Trick für mich unter OSX ausgeführt
Caio Iglesias
1
Wenn Sie das Programm mit nicht finden können which(wenn es noch nicht in Ihrem Pfad ist), können Sie auch versuchen, die Binärdatei unter mlocateLinux oder mdfindMacOS zu finden.
Jackcogdill
53

Unter macOS mit der Standard-Python-Installation müssen Sie /Users/<you>/Library/Python/2.7/bin/Ihrem $ PATH hinzufügen .

Fügen Sie dies Ihrem .bash_profile hinzu:

export PATH="/Users/<you>/Library/Python/2.7/bin:$PATH"

Dort installiert pip die ausführbaren Dateien.

Tipp: Bei einer nicht standardmäßigen Python-Version können which pythonSie den Speicherort Ihrer Python-Installation ermitteln und diesen Teil im obigen Pfad ersetzen. (Danke für den Hinweis Sanket_Diwale)

joh-mue
quelle
8
Der Ort, an dem pip installiert wird, hängt davon ab, wie Sie Python installiert haben. MacOS bietet mehrere Möglichkeiten zur Installation von Python, z. B. Macports, Homebrew und Systemstandard. Abhängig davon, welche Python-Version verwendet wird, haben Sie unterschiedliche Speicherorte für pip. Eine einfache Möglichkeit, herauszufinden, wo sich pip und python befinden, besteht darin, "which python" im Terminal zu verwenden und dann dem $ PATH den entsprechenden Speicherort hinzuzufügen.
Sanket_Diwale
Für macOS 10.14.3 which python3führte mich die Installation von Python 3.6 von python.org schließlich (über einen Link) zu /Library/Frameworks/Python.framework/Versions/3.6/bin/.
Phoenix
42

Wenn Sie mit --user(z. B. pip3.6 install --user tmuxp) installieren , ist es möglich, das plattformspezifische Benutzerinstallationsverzeichnis mithilfe des siteModuls von Python selbst abzurufen . Zum Beispiel unter macOS:

$ python2.7 -m site --user-base
/Users/alexp/Library/Python/2.7

Durch Anhängen /binhaben wir jetzt den Pfad, in dem ausführbare Paketdateien installiert werden. Wir können den PATH basierend auf der Ausgabe dynamisch in die RC-Datei Ihrer Shell einfügen. Ich benutze Bash, aber mit etwas Glück ist dies portabel:

# Add Python bin directories to path
python3.6 -m site &> /dev/null && PATH="$PATH:`python3.6 -m site --user-base`/bin"
python2.7 -m site &> /dev/null && PATH="$PATH:`python2.7 -m site --user-base`/bin"

Ich verwende die genauen Python-Versionen, um die Wahrscheinlichkeit zu verringern, dass die ausführbaren Dateien nur "verschwinden", wenn Python eine Nebenversion aktualisiert, z. B. von 3.5 auf 3.6. Sie verschwinden, da der Benutzerinstallationspfad, wie oben zu sehen, möglicherweise die Python-Version enthält. Während also python3auf 3.5 oder 3.6 zeigen könnte, python3.6wird immer auf 3.6 zeigen. Dies muss bei der Installation weiterer Pakete berücksichtigt werden, z . B. bei Verwendung pip3.6über pip3.

Wenn Sie nicht die Idee der Pakete verschwindenden ausmacht, können Sie verwenden python2und python3stattdessen:

# Add Python bin directories to path
# Note: When Python is upgraded, packages may need to be re-installed
#       or Python versions managed.
python3 -m site &> /dev/null && PATH="$PATH:`python3 -m site --user-base`/bin"
python2 -m site &> /dev/null && PATH="$PATH:`python2 -m site --user-base`/bin"
Alex Palmer
quelle
21

Ich weiß, dass die Frage nach macOS gestellt wird, aber hier ist eine Lösung für Linux- Benutzer, die über Google hierher kommen.

Ich hatte das in dieser Frage beschriebene Problem, nachdem ich das pdfx- Paket über pip installiert hatte .

Als ich es jedoch lief, nichts ...

pip list | grep pdfx
pdfx (1.3.0)

Noch:

which pdfx
pdfx not found

Das Problem unter Linux ist, dass pip install ...Skripte abgelegt werden ~/.local/binund dies nicht auf dem Standard-Debian / Ubuntu ist $PATH.

Hier ist ein GitHub-Problem, das ausführlicher beschrieben wird: https://github.com/pypa/pip/issues/3813

Zum Beheben fügen ~/.local/binSie einfach Ihre hinzu $PATH, indem Sie beispielsweise die folgende Zeile zu Ihrer .bashrcDatei hinzufügen :

export PATH="$HOME/.local/bin:$PATH"

Starten Sie danach Ihre Shell neu und die Dinge sollten wie erwartet funktionieren.

James Hibbard
quelle
2
Anstatt Ihre Shell neu zu starten, können Sie source ~/.bashrcdie .bashrcKonfiguration neu laden
Whiteclaws
1
Toll. Ich bekam "Tox-Befehl nicht gefunden". Nach dem Update von PATH funktioniert es
GabrielBB
3

Unter Windows müssen Sie den Pfad %USERPROFILE%\AppData\Roaming\Python\Scriptszu Ihrem Pfad hinzufügen .

Jared Beach
quelle
3

Lösung

Basierend auf anderen Antworten können Sie für linuxund macFolgendes ausführen:

echo "export PATH=\"`python3 -m site --user-base`/bin:$PATH\"" >> ~/.bashrc
source ~/.bashrc

statt python3Sie eine andere Verbindung zu Python - Version verwenden können: python, python2.7, python3.6, python3.9, usw.

Erläuterung

Um zu wissen, wo die Benutzerpakete im aktuellen Betriebssystem (Win, Mac, Linux) installiert sind, führen wir Folgendes aus:

python3 -m site --user-base

Wir wissen, dass die Skripte in den bin/Ordner verschoben werden , in dem die Pakete installiert sind.

Also verketten wir die Pfade:

echo `python3 -m site --user-base`/bin

Dann exportieren wir das in eine Umgebungsvariable.

export PATH=\"`python3 -m site --user-base`/bin:$PATH\""

Um zu vermeiden, dass der Exportbefehl wiederholt wird, fügen wir ihn unserer .bashrcDatei hinzu und sourceführen die neuen Änderungen aus. Dabei erhalten wir die am Anfang erwähnte Lösungsvorschläge.

Willemoes
quelle
Das hat bei mir funktioniert und ich weiß nicht warum
Benjamints
@Benjamints hat eine Erklärung hinzugefügt, hoffe es hilft, viel Glück!
Willemoes
vielen Dank! :)
Benjamints
2

Ich bin auf diese Frage gestoßen, weil ich ein PyPI-Paket erstellt, erfolgreich erstellt und veröffentlicht habe, es aber nach der Installation nicht ausführen konnte. Die $PATHVariable wurde korrekt eingestellt.

In meinem Fall war das Problem, dass ich das entry_pointin der setup.pyDatei nicht festgelegt hatte :

entry_points = {'console_scripts':

['YOUR_CONSOLE_COMMAND=MODULE_NAME.FILE_NAME:FUNCTION_NAME'],},
Thomas Johannesmeyer
quelle
2

Zusätzlich zum Hinzufügen des Python- binVerzeichnisses zur $PATHVariablen musste ich auch den Eigentümer dieses Verzeichnisses ändern, damit es funktioniert. Keine Ahnung, warum ich nicht schon der Besitzer war.

chown -R ~/Library/Python/
d4Rk
quelle