跑步os.path.basename(__file__)
有時給我的文件名爲foo.py
,但有時它會給foo.pyc
。我知道pyc是編譯的文件,然後可能每次編譯後都使用它。我只是困惑,爲什麼basename
返回pyc文件名?這是正常的嗎?其次,我怎樣才能讓它總是返回未編譯的文件名或沒有擴展名?爲什麼basename返回編譯的文件名?
回答
在Python 2中,__file__
反映了實際爲模塊*加載的文件。當導入一個模塊時,Python會嘗試首先找到一個.pyc
文件,如果發現這將是使用的文件名,否則它將是.py
文件。
它可能是,如果__file__
點對翻譯的下一個運行一個.py
你會發現它加載的.pyc
文件代替,如Python會嘗試,如果它可以創建一個緩存文件。還請注意,有可能不是是.py
源文件;有些項目僅以.pyc
文件的形式分發。最後但並非最不重要的一點,Python從不會爲頂層腳本創建一個.pyc
文件。
生成.py
源文件文件名的自動防故障方法是簡單地從最後剝去c
;你可以包括d
處理.pyd
文件(優化代碼,目前僅剝離斷言)太:
sourcefile = __file__.rstrip('cd')
做檢查,如果該文件確實存在!
* Python 3中改變緩存的字節碼文件的存儲位置,如果有一個即使.pyc
文件存在__file__
將使用源文件路徑。
爲什麼你比'splitext'更喜歡'rstrip'? – Tjorriemorrie
@Tjorriemorrie:簡單。它適用於所有可加載的模塊擴展名('.dll','.so','.pyc','.pyd'和'.py') –
__file__
是在您有機會做任何事情之前定義的。如果你想獲得.py
文件,而不是,你需要弄清楚它是什麼你自己:
without_ext = os.path.splitext(os.path.basename(__file__))[0]
with_new_ext = os.path.extsep.join(without_ext, "py")
有時,.py
文件根本不存在。由於您編寫了代碼,因此您不可能刪除它,但存在這種可能性。爲確保它存在,請使用os.path.isfile()
- 1. basename()返回int?
- 2. 編譯C++文件時爲什麼命名爲「a.out」?
- 3. perl的 - 文件:: Basename-> fileparse回報 「文件::名前綴」
- 4. 爲什麼源文件的名稱會影響編譯?
- 5. 爲什麼。加入返回的翻譯:
- 6. 爲什麼編譯一個PHP文件?
- 7. 爲什麼編譯文件兩次
- 8. 爲什麼編譯器認爲Environment.Exit可以返回?
- 9. 爲什麼FindFirst返回與掩碼不匹配的文件名?
- 10. 爲什麼glob`* [!t] *`返回名稱包含`t`的文件?
- 11. 爲什麼pywhois返回空頭文件?
- 12. 爲什麼「返回姓名」是空的?
- 13. 爲什麼Java編譯器需要返回值?
- 14. 爲什麼不能從編譯查詢返回列表?
- 15. 爲什麼instanceof有時不會編譯,有時會返回false?
- 16. 爲什麼編譯器假定malloc返回一個int?
- 17. 爲什麼Heroku返回'devise/sessions.js沒有預編譯'?
- 18. JAVA:爲什麼在編譯期間返回錯誤?
- 19. 爲什麼我可以用2個返回來編譯代碼?
- 20. 編譯器不會抱怨返回類型。爲什麼?
- 21. 爲什麼Java編譯器不讓我返回一個泛型?
- 22. 爲什麼打字稿編譯犯規允許返回類
- 23. java file.renameTo()重命名文件,但返回false。爲什麼?
- 24. 爲什麼Shift_JIS字符集編碼文件返回EUC_JP類型?
- 25. 爲什麼我的PHP文件返回什麼?
- 26. 爲什麼不編譯編譯錯誤?
- 27. 爲什麼要返回令牌名稱?
- 28. 爲什麼firebase push_token返回黑名單?
- 29. 爲什麼document.getElementsByClassName(「類名」)返回對象
- 30. 爲什麼要命名返回參數?
這是在一個導入的模塊中調用的嗎? –
'os.path.splitext(os.path.basename(__ file __))[0] + os.path.extsep +「py」' – zondo
您可能無法更改'__file__'的初始值,但您可以單獨使用'os.path.splitext()'從文件名擴展。 – martineau