webentwicklung-frage-antwort-db.com.de

Wie ist PYTHONPATH anzuwenden?

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?

117
Randy Skretka

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.

147
Pedro Werneck

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.

43
Richard

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.

31
codedstructure

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
2
W4t3randWind

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.

0
Tigran Saluev