Wie kann ich PYTHONPATH verwenden? Wenn ich versuche, ein Skript im Pfad auszuführen, wird die Datei nicht gefunden. Wenn ich in das Verzeichnis mit dem Skript wechsle, 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 cd in das Dateiverzeichnis läuft es ..
$ python gbmx.py -h
usage: gbmx.py [-h] [-b]
Warum kann ich den PYTHONPATH nicht benutzen?
Ich denke, du bist etwas verwirrt. PYTHONPATH legt den Suchpfad für importing Python-Module fest, nicht um sie so auszuführen, wie Sie es versuchen.
PYTHONPATH Erweitern Sie den Standardsuchpfad für Moduldateien. Das Das Format ist das gleiche wie das PATH der Shell: ein oder mehrere Verzeichnisse Pfadnamen getrennt durch os.pathsep (z. B. Doppelpunkte unter Unix oder Semikolons unter Windows). Nicht vorhandene Verzeichnisse werden unbemerkt ignoriert.
Zusätzlich zu normalen Verzeichnissen können einzelne PYTHONPATH-Einträge verweisen Sie auf zip-Dateien, die reine Python-Module enthalten (entweder als Quelle oder kompilierte Form). Erweiterungsmodule können nicht aus ZIP-Dateien importiert werden.
Der Standardsuchpfad ist von der Installation abhängig, im Allgemeinen jedoch beginnt mit dem Präfix/lib/pythonversion (siehe PYTHONHOME oben). Es ist immer an PYTHONPATH angehängt.
Ein zusätzliches Verzeichnis wird in den Suchpfad vor .__ eingefügt. von PYTHONPATH wie oben unter Schnittstellenoptionen beschrieben. Die Suche Der Pfad kann innerhalb eines Python-Programms als Variable .__ bearbeitet werden. sys.path.
http://docs.python.org/2/using/cmdline.html#envvar-PYTHONPATH
Was Sie suchen, ist PFAD.
export PATH=$PATH:/home/randy/lib/python
Um Ihr Python-Skript als Programm auszuführen, müssen Sie jedoch in der ersten Zeile ein Shebang für Python festlegen. So etwas sollte funktionieren:
#!/usr/bin/env python
Und geben Sie ihm Ausführungsprivilegien:
chmod +x /home/randy/lib/python/gbmx.py
Dann sollten Sie gmbx.py
einfach von überall ausführen können.
Sie verwirren PFAD und PYTHONPATH. Sie müssen das 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.
PYTHONPATH
betrifft nur import
-Anweisungen, nicht jedoch die Suche nach Python-Dateien des Python-Interpreters auf oberster Ebene, die als Argumente angegeben werden.
Das Festlegen von PYTHONPATH
ist keine gute Idee - da bei allem, was von Umgebungsvariablen abhängt, das gleichmäßige Replizieren von Dingen auf verschiedenen Maschinen schwierig wird. Besser ist es, Python-Pakete zu verwenden, die in systemabhängigen Pfaden installiert werden können, die Python bereits kennt (mithilfe von Pip oder Distutils).
Lesen Sie [ http://guide.python-distribute.org/introduction.html - Broken Link] https://the-hitchhikers-guide-to-packaging.readthedocs.org/de/ latest/ - 'Der Anhalter durch Hitchhiker zum Verpacken' und auch http://docs.python.org/2/tutorial/modules.html - was PYTHONPATH und Pakete auf einer niedrigeren Ebene erklärt.
Ich denke, Sie sind mit PATH und PYTHONPATH vermischt. Um ein 'Skript' auszuführen, müssen Sie nur das Elternverzeichnis an Ihre PATH-Variable anhängen. Sie können dies testen, indem Sie ausführen
which myscript.py
Wenn myscripy.py
von benutzerdefinierten Modulen abhängt, müssen auch die übergeordneten Verzeichnisse der PYTHONPATH-Variablen hinzugefügt werden. Da die Designer von Python eindeutig auf Drogen setzen, kann das Testen Ihrer Importe in der folgenden Version 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 im 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
Wenn PYTHONPATH wie in Ihrem Beispiel eingestellt ist, sollten Sie dies können
python -m gmbx
Mit der Option -m
sucht Python nach Pfaden, in denen Python normalerweise nach Modulen sucht, einschließlich der von PYTHONPATH hinzugefügten. Wenn Sie einen Interpreter wie python gmbx.py
ausführen, wird nach einer bestimmten Datei gesucht, und PYTHONPATH gilt nicht.