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?
Antwort
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.
Warum bevorzugen Sie 'rstrip' gegenüber 'splitext'? – Tjorriemorrie
@Tjorriemorrie: einfacher.Es funktioniert für alle ladbaren Modulerweiterungen ('.dll',' .so', '.pyc',' .pyd' und '.py') –
__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()
- 1. Warum gibt Math.Cos den falschen Wert zurück?
- 2. Warum gibt der Zuweisungsoperator den zugewiesenen Wert in C# zurück?
- 3. Make PHP pathinfo() gibt den korrekten Dateinamen zurück, wenn der Dateiname UTF-8 ist
- 4. Warum gibt file_exists() false zurück?
- 5. Wählen Sie den Speicherort der kompilierten Datei
- 6. Warum gibt Microsoft _wspawnv EINVAL zurück?
- 7. Hauptfunktion gibt nichts zurück. Warum?
- 8. Suchen und Basisname nicht gut wiedergegeben
- 9. System.js builder.buildStatic gibt nur den Dateinamen aus
- 10. Warum gibt CMSampleBufferGetImageBuffer NULL zurück
- 11. Warum gibt RedirectToAction null zurück?
- 12. Warum gibt GetFields() nichts zurück?
- 13. Warum gibt Files.probeContentType Null zurück
- 14. Warum gibt string.contains() false zurück?
- 15. Warum gibt sys.getrefcount() 2 zurück?
- 16. Warum gibt SelectSingleNode null zurück?
- 17. Warum gibt SCOPE_IDENTITY() -1 zurück?
- 18. Warum file_get_contents gibt Fehler zurück?
- 19. Warum gibt is_array() false zurück?
- 20. Warum gibt getHandler() null zurück?
- 21. CurrentDb.RecordsAffected gibt 0 zurück. Warum?
- 22. Warum gibt os.path.isfile False zurück?
- 23. Warum JSON.stringify gibt undefined zurück
- 24. JavaScript: Warum [] + (- ~ {} - ~ {} - ~ {} - ~ {}) + (- ~ {} - ~ {}); gibt "42" zurück
- 25. Warum gibt diese Begrüßungsfunktion nicht den akzeptierten Wert zurück?
- 26. Warum gibt dieser Codeabschnitt den Fehler "Segmentierungsfehler" zurück?
- 27. Warum gibt Enum.ToString() den richtigen Namen nicht zurück?
- 28. Warum gibt decltype (* this) nicht den richtigen Typ zurück?
- 29. Warum gibt Python Max ('a', 5) den Zeichenfolgenwert zurück?
- 30. Layout der kompilierten Objekte
Wird dies in einem importierten Modul aufgerufen? –
'os.path.splitext (os.path.basename (__ file __)) [0] + os.path.extsep +" py "' – zondo
Sie können den Anfangswert von '__file__' wahrscheinlich nicht ändern, aber Sie können trennen die Erweiterung vom Dateinamen mit 'os.path.splitext()'. – martineau