Was bedeutet die Variable __file__?


177
A = os.path.join(os.path.dirname(__file__), '..')

B = os.path.dirname(os.path.realpath(__file__))

C = os.path.abspath(os.path.dirname(__file__))

Normalerweise verdrahtete ich diese nur mit dem tatsächlichen Pfad. Es gibt jedoch einen Grund für diese Anweisungen, die den Pfad zur Laufzeit bestimmen, und ich möchte das Modul os.path wirklich verstehen, damit ich es verwenden kann.

Antworten:


162

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.pyund so weiter) , um zu sehen , welchen Unterschied das macht.


7
Gute Antwort, aber sehen Sie andere ein wichtiges Detail aus anderen Antworten: __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.
Chris Johnson

5
Im Interpreter kehren alle Beispiele zurück name '__file__' is not defined.
user1063287

10
@ user1063287 Sehen Sie sich die Antwort von DemoUser an. __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 ...)
JUNGER

59

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 .pyDatei ein Modul. Also import amodulewird ein Attribut haben, __file__das unter verschiedenen Umständen verschiedene Dinge bedeutet.

Entnommen aus den Dokumenten:

__file__ist der Pfadname der Datei, aus der das Modul geladen wurde, wenn es aus einer Datei geladen wurde. Das __file__Attribut ist für C-Module, die statisch mit dem Interpreter verknüpft sind, nicht vorhanden. Bei Erweiterungsmodulen, die dynamisch aus einer gemeinsam genutzten Bibliothek geladen werden, ist dies der Pfadname der gemeinsam genutzten Bibliotheksdatei.

In Ihrem Fall greift das Modul auf sein eigenes __file__Attribut im globalen Namespace zu.

Um dies in Aktion zu sehen, versuchen Sie:

# file: test.py

print globals()
print __file__

Und Renn:

python test.py

{'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', '__file__':
 'test_print__file__.py', '__doc__': None, '__package__': None}
test_print__file__.py

23

Gemäß der Dokumentation :

__file__ist der Pfadname der Datei, aus der das Modul geladen wurde, wenn es aus einer Datei geladen wurde. Das __file__Attribut ist für C-Module, die statisch mit dem Interpreter verknüpft sind, nicht vorhanden. Bei Erweiterungsmodulen, die dynamisch aus einer gemeinsam genutzten Bibliothek geladen werden, ist dies der Pfadname der gemeinsam genutzten Bibliotheksdatei.

und auch :

__file__soll der "Pfad" zur Datei sein, es sei denn, das Modul ist eingebaut (und somit in aufgelistet sys.builtin_module_names). In diesem Fall ist das Attribut nicht festgelegt.


13

Durch die __file__Kombination mit verschiedenen os.pathModulen 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:

A = '/Users/myname/Projects/mydevproject/somefile.txt'

Versuchen Sie dann, es mit einem Bereitstellungsverzeichnis auf Ihrem Server bereitzustellen, /home/web/mydevproject/da Ihr Code die Pfade dann nicht richtig finden kann.

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.