Ich habe Probleme beim Verstehen __file__
. Soweit ich weiß, wird __file__
der absolute Pfad zurückgegeben, von dem das Modul geladen wurde.
Ich habe Probleme, dies zu produzieren: Ich habe eine abc.py
mit einer Anweisung print __file__
, die von /d/projects/
python abc.py
Rückgaben ausgeht abc.py
. läuft von /d/
Retouren projects/abc.py
. Irgendwelche Gründe warum?
Antworten:
Aus der Dokumentation :
Aus dem Mailinglisten-Thread, der von @kindall in einem Kommentar zur Frage verlinkt wurde:
Im Übrigen sollten Sie
sys.path
nicht berücksichtigen''
.Wenn Sie sich also außerhalb des Teils
sys.path
befinden, der das Modul enthält, erhalten Sie einen absoluten Pfad . Wenn Sie sich in dem Teilsys.path
befinden, der das Modul enthält, erhalten Sie einen relativen Pfad .Wenn Sie ein Modul im aktuellen Verzeichnis zu laden, und das aktuelle Verzeichnis ist nicht in
sys.path
, werden Sie einen absoluten Pfad bekommen.Wenn Sie ein Modul im aktuellen Verzeichnis laden, und das aktuelle Verzeichnis ist in
sys.path
, werden Sie einen relativen Pfad bekommen.quelle
sys.path
, werden Sie einen absoluten Pfad bekommen. Wenn Sie ein Modul im aktuellen Verzeichnis laden, und das aktuelle Verzeichnis ist insys.path
, werden Sie einen relativen Pfad bekommen.sys.path
nicht enthalten''
.__file__
ist seit Python 3.4 absolut , außer wenn ein Skript direkt über einen relativen Pfad ausgeführt wird:Ich bin mir nicht sicher, ob Symlinks aufgelöst werden.
Beispiel für die Übergabe eines relativen Pfads:
quelle
Python 3.4.0 (default, Apr 11 2014, 13:05:11) [GCC 4.8.2] on linux
). Und Symlinks werden in meinen Versuchen nicht gelöst.os.path.realpath(__file__)
der richtige Weg, um symbolische Links aufzulösen?Spätes einfaches Beispiel:
Unter Python-2. * Bestimmt der zweite Aufruf fälschlicherweise das
path.abspath(__file__)
basierend auf dem aktuellen Verzeichnis:Wie von @techtonik in Python 3.4+ festgestellt, funktioniert dies einwandfrei, da
__file__
ein absoluter Pfad zurückgegeben wird.quelle
__main__
Moduls, in dem sich__file__
möglicherweise ein relativer Pfad befindet.Mithilfe der von @kindall bereitgestellten Guido-Mail können wir den Standardimportprozess so verstehen, dass versucht wird, das Modul in jedem Mitglied von
sys.path
und die Datei als Ergebnis dieser Suche zu finden (weitere Details in PyMOTW-Module und -Importe ). Wenn sich das Modul also in einem absoluten Pfadsys.path
befindet, ist das Ergebnis absolut, aber wenn es sich in einem relativen Pfad befindet, istsys.path
das Ergebnis relativ.Jetzt
site.py
sorgt die Startdatei dafür, dass nur der absolute Pfadsys.path
mit Ausnahme des Anfangs''
eingegeben wird. Wenn Sie ihn also nicht auf andere Weise als durch Festlegen des PYTHONPATH ändern (dessen Pfad vor dem Präfix ebenfalls absolut gemacht wirdsys.path
), erhalten Sie immer einen absoluten Pfad, aber wenn auf das Modul über das aktuelle Verzeichnis zugegriffen wird.Wenn Sie sys.path auf witzige Weise austricksen, können Sie alles bekommen.
Als Beispiel , wenn Sie einen Probe - Modul haben
foo.py
in/tmp/
mit dem Code:Wenn Sie in / tmp gehen, erhalten Sie:
Wenn Sie in in
/home/user
, wenn Sie/tmp
Ihre hinzufügen, erhaltenPYTHONPATH
Sie:Selbst wenn Sie hinzufügen
../../tmp
, wird es normalisiert und das Ergebnis ist das gleiche.Aber wenn Sie anstatt
PYTHONPATH
direkt einen lustigen Pfad zu verwenden, erhalten Sie ein Ergebnis, das so lustig ist wie die Ursache.Guido erklärt im oben zitierten Thread, warum Python nicht versucht, alle Einträge in absolute Pfade umzuwandeln:
Ihr Pfad wird also so verwendet, wie er ist .
quelle