2016-04-18 7 views
1

Laufen os.path.basename(__file__) manchmal geben Sie mir den Dateinamen als foo.py, aber andere Male gibt es foo.pyc. Ich verstehe, dass die Pyc die kompilierte Datei ist, die dann wahrscheinlich jedes Mal verwendet wird, nachdem sie kompiliert wurde. Ich bin nur verwirrt, warum die basename den Pyc-Dateinamen zurückgibt? Ist das normal? Zweitens, wie kann ich dafür sorgen, dass immer der nichtkompilierte Dateiname oder die Erweiterung zurückgegeben wird?Warum gibt der Basisname den kompilierten Dateinamen zurück?

+0

Wird dies in einem importierten Modul aufgerufen? –

+0

'os.path.splitext (os.path.basename (__ file __)) [0] + os.path.extsep +" py "' – zondo

+0

Sie können den Anfangswert von '__file__' wahrscheinlich nicht ändern, aber Sie können trennen die Erweiterung vom Dateinamen mit 'os.path.splitext()'. – martineau

Antwort

3

In Python 2, __file__ spiegelt die Datei, die tatsächlich für das Modul geladen wurde *. Wenn Sie ein Modul importieren, versucht Python zuerst, eine Datei zu finden, und falls gefunden, wird dies der Dateiname sein, ansonsten wird es die .py Datei sein.

Es kann sein, dass, wenn __file__ verweist auf eine .py auf dem nächsten Lauf des Dolmetschers, Sie finden es eine .pyc Datei stattdessen geladen, wie Python versucht, eine Cache-Datei zu erstellen, wenn er kann. Beachten Sie auch, dass dort nicht eine .py Quelldatei sein kann; Einige Projekte werden nur in Form von .pyc Dateien verteilt. Zu guter Letzt erstellt Python niemals eine .pyc Datei für das Script der obersten Ebene.

Eine ausfallsichere Möglichkeit, einen .py Quellendateinamen zu erzeugen, besteht darin, einfach die c vom Ende zu entfernen; Sie könnten eine d.pyd Dateien zu handhaben (optimierte Bytecode, die derzeit nur Strippen behauptet) zu:

sourcefile = __file__.rstrip('cd') 

Sie überprüfen, ob die Datei existiert tatsächlich!


* Python 3 geändert, wo die im Cache gespeicherten Bytecode-Datei gespeichert ist, und __file__ wird die Quelldatei Pfad verwenden, wenn es eine selbst wenn eine .pyc Datei vorhanden ist.

+0

Warum bevorzugen Sie 'rstrip' gegenüber 'splitext'? – Tjorriemorrie

+0

@Tjorriemorrie: einfacher.Es funktioniert für alle ladbaren Modulerweiterungen ('.dll',' .so', '.pyc',' .pyd' und '.py') –

1

__file__ ist definiert, bevor Sie die Möglichkeit haben, etwas dagegen zu tun. Wenn Sie die .py Datei stattdessen erhalten möchten, müssen Sie herausfinden, was es selbst ist:

without_ext = os.path.splitext(os.path.basename(__file__))[0] 
with_new_ext = os.path.extsep.join(without_ext, "py") 

Manchmal ist die .py Datei nicht existiert noch. Da Sie den Code geschrieben haben, haben Sie ihn wahrscheinlich nicht gelöscht, aber es gibt diese Möglichkeit. Um sicherzustellen, dass es verwenden existiert os.path.isfile()

Verwandte Themen