2016-04-18 40 views
1

跑步os.path.basename(__file__)有時給我的文件名爲foo.py,但有時它會給foo.pyc。我知道pyc是編譯的文件,然後可能每次編譯後都使用它。我只是困惑,爲什麼basename返回pyc文件名?這是正常的嗎?其次,我怎樣才能讓它總是返回未編譯的文件名或沒有擴展名?爲什麼basename返回編譯的文件名?

+0

這是在一個導入的模塊中調用的嗎? –

+0

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

+0

您可能無法更改'__file__'的初始值,但您可以單獨使用'os.path.splitext()'從文件名擴展。 – martineau

回答

3

在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__將使用源文件路徑。

+0

爲什麼你比'splitext'更喜歡'rstrip'? – Tjorriemorrie

+0

@Tjorriemorrie:簡單。它適用於所有可加載的模塊擴展名('.dll','.so','.pyc','.pyd'和'.py') –

1

__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()

相關問題