Wie kann ich ein Python-Skript in der Befehlszeile verwenden, ohne in sein Verzeichnis zu wechseln? Ist es der PYTHONPATH?


157

Wie kann ich PYTHONPATH nutzen? Wenn ich versuche, ein Skript im Pfad auszuführen, wird die Datei nicht gefunden. Wenn ich in das Verzeichnis mit dem Skript cd, wird das Skript ausgeführt. Was nützt der PYTHONPATH?

$ echo $PYTHONPATH
:/home/randy/lib/python

$ tree -L 1 '/home/randy/lib/python' 
/home/randy/lib/python
├── gbmx_html.py
├── gbmx.py
├── __init__.py
├── __pycache__
├── scripts
└── yesno.py

$ python gbmx.py -h
python: can't open file 'gbmx.py': [Errno 2] No such file or directory

$ cd '/home/randy/lib/python'

Nach der CD in das Dateiverzeichnis läuft es ..

$ python gbmx.py -h
usage: gbmx.py [-h] [-b]

Warum kann ich den PYTHONPATH nicht benutzen?


1
Können wir den Titel dieses Beitrags ändern? Es wird eigentlich nicht um eine Erklärung gebeten PYTHONPATH.
Nico Cernek

Titel bearbeitet, weil dies das erste ist, was beim PYTHONPATH
Googeln auftaucht

Antworten:


194

Ich denke du bist ein bisschen verwirrt. PYTHONPATH legt den Suchpfad für den Import von Python-Modulen fest und nicht für die Ausführung, wie Sie es versuchen.

PYTHONPATH Erweitern Sie den Standardsuchpfad für Moduldateien. Das Format entspricht dem PATH der Shell: Ein oder mehrere Verzeichnispfadnamen, die durch os.pathsep getrennt sind (z. B. Doppelpunkte unter Unix oder Semikolons unter Windows). Nicht vorhandene Verzeichnisse werden stillschweigend ignoriert.

Zusätzlich zu normalen Verzeichnissen können einzelne PYTHONPATH-Einträge auf Zip-Dateien verweisen, die reine Python-Module enthalten (entweder in Quell- oder kompilierter Form). Erweiterungsmodule können nicht aus Zip-Dateien importiert werden.

Der Standardsuchpfad ist installationsabhängig, beginnt jedoch im Allgemeinen mit dem Präfix / lib / pythonversion (siehe PYTHONHOME oben). Es wird immer an PYTHONPATH angehängt.

Ein zusätzliches Verzeichnis wird in den Suchpfad vor PYTHONPATH eingefügt, wie oben unter Schnittstellenoptionen beschrieben. Der Suchpfad kann innerhalb eines Python-Programms als Variable sys.path bearbeitet werden.

http://docs.python.org/2/using/cmdline.html#envvar-PYTHONPATH

Was Sie suchen, ist PATH.

export PATH=$PATH:/home/randy/lib/python 

Um Ihr Python-Skript jedoch als Programm auszuführen, müssen Sie in der ersten Zeile einen Shebang für Python festlegen . So etwas sollte funktionieren:

#!/usr/bin/env python

Und geben Sie ihm Ausführungsrechte:

chmod +x /home/randy/lib/python/gbmx.py

Dann sollten Sie einfach gmbx.pyvon überall laufen können .


2
Danke Freund. Ich bügele das immer noch aus. Mein Skript kann meine Module erfolgreich aus meinem benutzerdefinierten PYTHONPATH importieren. Und jetzt verstehe ich den Unterschied: Es geht um Skript vs. Modul; Befehlsskriptaufruf vs. Python-Import. Ja, ich werde in der Tat verwendenexport PATH=$PATH:/home/etc
Randy Skretka

57

Sie verwechseln PATH und PYTHONPATH. Sie müssen dies tun:

export PATH=$PATH:/home/randy/lib/python 

PYTHONPATH wird vom Python-Interpreter verwendet, um zu bestimmen, welche Module geladen werden sollen.

PATH wird von der Shell verwendet, um zu bestimmen, welche ausführbaren Dateien ausgeführt werden sollen.


38

PYTHONPATHBetrifft nur importAnweisungen, nicht die Suche des Python-Interpreters nach Python-Dateien, die als Argumente angegeben wurden.

Das Festlegen PYTHONPATHist keine gute Idee - wie bei allem, was von Umgebungsvariablen abhängt, wird es schwierig, Dinge auf verschiedenen Computern konsistent zu replizieren. Besser ist es, Python-Pakete zu verwenden, die (mit 'pip' oder distutils) in systemabhängigen Pfaden installiert werden können, die Python bereits kennt.

Lesen Sie https://the-hitchhikers-guide-to-packaging.readthedocs.org/en/latest/ - 'The Hitchhiker's Guide to Packaging' und auch http://docs.python.org/3/tutorial /modules.html - erklärt PYTHONPATH und Pakete auf einer niedrigeren Ebene.


Punkt genommen. In diesem speziellen Fall scheint das Hinzufügen zu PYTHONPATH jedoch gut zu funktionieren. Als ein Benutzer auf einem Computer kann ich bereits geschriebenen .py-Code gut verwenden und wiederverwenden.
Randy Skretka

1
Ich denke ehrlich gesagt nicht, dass die Installation von Dingen in systemabhängigen Pfaden mit Root-Zugriff eine bessere Idee ist als die Verwendung PYTHONPATH. Ich zähle nicht mehr, wie oft ich mich mit einem rudimentären Python-Programm befassen musste, das darauf bestand pip install, dass ich ein regulärer Benutzer auf einem Host war, nicht nur ohne Root-Zugriff (ich weiß, dass pip eine lokale Installation durchführen kann), sondern auch ohne pip. Hier ist ein Rat an alle, die Python-Software vertreiben: Versuchen Sie zunächst, Ihre eigene Software auf einem Vanilla Linux-Host zu installieren, auf dem Sie keinen Root-Zugriff und nur eine Python-Kerndistribution ohne Pip haben.
amn

3

Ich denke, Sie sind zwischen PATH und PYTHONPATH verwechselt. Alles, was Sie tun müssen, um ein 'Skript' auszuführen, ist, dass das Elternverzeichnis an Ihre PATH-Variable angehängt wird. Sie können dies testen, indem Sie ausführen

which myscript.py

Wenn dies myscripy.pyvon benutzerdefinierten Modulen abhängt, müssen deren übergeordnete Verzeichnisse auch zur Variablen PYTHONPATH hinzugefügt werden. Da die Entwickler von Python eindeutig Drogen konsumierten, kann das Testen Ihrer Importe in der Antwort mit den folgenden Angaben leider nicht garantieren, dass Ihr PYTHONPATH für die Verwendung in einem Skript richtig eingestellt ist. Dieser Teil der Python-Programmierung ist magisch und kann beim Stackoverflow nicht angemessen beantwortet werden.

$python
Python 2.7.8 blahblahblah
...
>from mymodule.submodule import ClassName
>test = ClassName()
>^D
$myscript_that_needs_mymodule.submodule.py
Traceback (most recent call last):
  File "myscript_that_needs_mymodule.submodule.py", line 5, in <module>
    from mymodule.submodule import ClassName
  File "/path/to/myscript_that_needs_mymodule.submodule.py", line 5, in <module>
    from mymodule.submodule import ClassName
ImportError: No module named submodule

3

Wenn PYTHONPATH wie in Ihrem Beispiel eingestellt ist, sollten Sie dazu in der Lage sein

python -m gmbx

-mMit dieser Option sucht Python in Pfaden nach Ihrem Modul. Python sucht normalerweise nach Modulen, einschließlich der Elemente, die Sie zu PYTHONPATH hinzugefügt haben. Wenn Sie einen Interpreter wie ausführen python gmbx.py, sucht er nach einer bestimmten Datei und PYTHONPATH gilt nicht.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.