Mithilfe der von @kindall bereitgestellten Guido-Mail können wir den Standardimportprozess so verstehen, dass versucht wird, das Modul in jedem Mitglied von sys.pathund die Datei als Ergebnis dieser Suche zu finden (weitere Details in PyMOTW-Module und -Importe ). Wenn sich das Modul also in einem absoluten Pfad sys.pathbefindet, ist das Ergebnis absolut, aber wenn es sich in einem relativen Pfad befindet, ist sys.pathdas Ergebnis relativ.
Jetzt site.pysorgt die Startdatei dafür, dass nur der absolute Pfad sys.pathmit 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 wird sys.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.pyin /tmp/mit dem Code:
import sys
print(sys.path)
print (__file__)
Wenn Sie in / tmp gehen, erhalten Sie:
>>> import foo
['', '/tmp', '/usr/lib/python3.3', ...]
./foo.py
Wenn Sie in in /home/user, wenn Sie /tmpIhre hinzufügen, erhalten PYTHONPATHSie:
>>> import foo
['', '/tmp', '/usr/lib/python3.3', ...]
/tmp/foo.py
Selbst wenn Sie hinzufügen ../../tmp, wird es normalisiert und das Ergebnis ist das gleiche.
Aber wenn Sie anstatt PYTHONPATHdirekt einen lustigen Pfad zu verwenden, erhalten Sie ein Ergebnis, das so lustig ist wie die Ursache.
>>> import sys
>>> sys.path.append('../../tmp')
>>> import foo
['', '/usr/lib/python3.3', .... , '../../tmp']
../../tmp/foo.py
Guido erklärt im oben zitierten Thread, warum Python nicht versucht, alle Einträge in absolute Pfade umzuwandeln:
Wir möchten nicht bei jedem Import getpwd () aufrufen müssen. getpwd () ist relativ langsam und kann manchmal sofort fehlschlagen.
Ihr Pfad wird also so verwendet, wie er ist .