Wenn ein Modul aus einer Datei in Python geladen wird, __file__
wird es auf seinen Pfad gesetzt. Sie können dies dann mit anderen Funktionen verwenden, um das Verzeichnis zu finden, in dem sich die Datei befindet.
Nehmen Sie Ihre Beispiele einzeln:
A = os.path.join(os.path.dirname(__file__), '..')
# A is the parent directory of the directory where program resides.
B = os.path.dirname(os.path.realpath(__file__))
# B is the canonicalised (?) directory where the program resides.
C = os.path.abspath(os.path.dirname(__file__))
# C is the absolute path of the directory where the program resides.
Sie können die verschiedenen von diesen zurückgegebenen Werte hier sehen:
import os
print(__file__)
print(os.path.join(os.path.dirname(__file__), '..'))
print(os.path.dirname(os.path.realpath(__file__)))
print(os.path.abspath(os.path.dirname(__file__)))
und stellen Sie sicher , dass Sie es von verschiedenen Standorten ausgeführt werden (wie ./text.py
, ~/python/text.py
und so weiter) , um zu sehen , welchen Unterschied das macht.
__file__
ist NICHT in allen Fällen definiert, z. B. statisch verknüpfte C-Module. Wir können uns nicht darauf verlassen,__file__
immer verfügbar zu sein.name '__file__' is not defined
.__file__
ist der Pfadname der Datei, aus der das Modul geladen wurde, wenn es aus einer Datei geladen wurde. Dies bedeutet, dass__file__
es nur funktioniert, wenn Sie es als Skript ausführen, das nicht im Interpreter enthalten ist (es sei denn, Sie importieren es im Interpreter ...)Ich möchte nur zuerst auf einige Verwirrung eingehen.
__file__
ist kein Platzhalter, sondern ein Attribut. Doppelte Unterstrichattribute und -methoden gelten gemäß Konvention als "speziell" und dienen einem besonderen Zweck.http://docs.python.org/reference/datamodel.html zeigt viele der speziellen Methoden und Attribute, wenn nicht alle.
In diesem Fall
__file__
handelt es sich um ein Attribut eines Moduls (ein Modulobjekt). In Python ist eine.py
Datei ein Modul. Alsoimport amodule
wird ein Attribut haben,__file__
das unter verschiedenen Umständen verschiedene Dinge bedeutet.Entnommen aus den Dokumenten:
In Ihrem Fall greift das Modul auf sein eigenes
__file__
Attribut im globalen Namespace zu.Um dies in Aktion zu sehen, versuchen Sie:
Und Renn:
quelle
Gemäß der Dokumentation :
und auch :
quelle
Durch die
__file__
Kombination mit verschiedenenos.path
Modulen können alle Pfade relativ zum Verzeichnis des aktuellen Moduls sein. Dadurch können Ihre Module / Projekte auf andere Maschinen portiert werden.In Ihrem Projekt tun Sie:
Versuchen Sie dann, es mit einem Bereitstellungsverzeichnis auf Ihrem Server bereitzustellen,
/home/web/mydevproject/
da Ihr Code die Pfade dann nicht richtig finden kann.quelle