Ich werde auch versuchen, einige Variationen dieser Frage anzugehen:
- Finden des Pfades des aufgerufenen Skripts
- Suchen des Pfads des aktuell ausgeführten Skripts
- Suchen des Verzeichnisses des aufgerufenen Skripts
(Einige dieser Fragen wurden auf SO gestellt, aber als Duplikate geschlossen und hier umgeleitet.)
Vorsichtsmaßnahmen bei der Verwendung __file__
Für ein Modul, das Sie importiert haben:
import something
something.__file__
gibt den absoluten Pfad des Moduls zurück. Angesichts des folgenden Skripts foo.py:
#foo.py
print '__file__', __file__
Wenn Sie es mit 'python foo.py' aufrufen, wird einfach 'foo.py' zurückgegeben. Wenn Sie einen Schebang hinzufügen:
#!/usr/bin/python
#foo.py
print '__file__', __file__
und rufen Sie es mit ./foo.py auf, es wird './foo.py' zurückgeben. Rufen Sie es aus einem anderen Verzeichnis auf (z. B. foo.py in die Verzeichnisleiste einfügen) und rufen Sie dann eines der beiden auf
python bar/foo.py
oder einen Shebang hinzufügen und die Datei direkt ausführen:
bar/foo.py
gibt 'bar / foo.py' (den relativen Pfad) zurück.
Das Verzeichnis finden
Jetzt von dort aus das Verzeichnis zu bekommen, os.path.dirname(__file__)
kann auch schwierig sein. Zumindest auf meinem System wird eine leere Zeichenfolge zurückgegeben, wenn Sie sie aus demselben Verzeichnis wie die Datei aufrufen. Ex.
# foo.py
import os
print '__file__ is:', __file__
print 'os.path.dirname(__file__) is:', os.path.dirname(__file__)
wird ausgegeben:
__file__ is: foo.py
os.path.dirname(__file__) is:
Mit anderen Worten, es wird eine leere Zeichenfolge zurückgegeben, sodass dies nicht zuverlässig erscheint, wenn Sie es für die aktuelle Datei verwenden möchten (im Gegensatz zur Datei eines importierten Moduls). Um dies zu umgehen, können Sie es in einen Aufruf an abspath einwickeln:
# foo.py
import os
print 'os.path.abspath(__file__) is:', os.path.abspath(__file__)
print 'os.path.dirname(os.path.abspath(__file__)) is:', os.path.dirname(os.path.abspath(__file__))
welches etwas ausgibt wie:
os.path.abspath(__file__) is: /home/user/bar/foo.py
os.path.dirname(os.path.abspath(__file__)) is: /home/user/bar
Beachten Sie, dass abspath () Symlinks NICHT auflöst. Wenn Sie dies tun möchten, verwenden Sie stattdessen realpath (). Erstellen Sie beispielsweise einen Symlink file_import_testing_link, der auf file_import_testing.py verweist, mit dem folgenden Inhalt:
import os
print 'abspath(__file__)',os.path.abspath(__file__)
print 'realpath(__file__)',os.path.realpath(__file__)
Beim Ausführen werden absolute Pfade wie folgt gedruckt:
abspath(__file__) /home/user/file_test_link
realpath(__file__) /home/user/file_test.py
file_import_testing_link -> file_import_testing.py
Mit inspizieren
@SummerBreeze erwähnt die Verwendung der Inspektion Modul.
Dies scheint für importierte Module gut zu funktionieren und ist recht prägnant:
import os
import inspect
print 'inspect.getfile(os) is:', inspect.getfile(os)
gibt gehorsam den absoluten Pfad zurück. Um den Pfad des aktuell ausgeführten Skripts zu finden, habe ich jedoch keine Möglichkeit gefunden, es zu verwenden.