我正在嘗試獲取當前正在運行的Python腳本的名稱。 html
我有一個名爲foo.py
的腳本,我想作這樣的事情以得到腳本名稱: python
print Scriptname
請注意, __file__
將提供此代碼所在的文件,該文件能夠導入,而且與要解釋的主文件不一樣。 要獲取主文件,可使用特殊的__main__模塊: 工具
import __main__ as main print(main.__file__)
請注意, __main__.__file__
在Python 2.7中有效,但在3.2中無效,所以請使用上述import-as語法使其具備可移植性。 spa
上述答案是好的。 可是我發現使用上面的結果這種方法更有效。
這致使實際的腳本文件名不是路徑。 操作系統
import sys import os file_name = os.path.basename(sys.argv[0])
爲了完整起見,我認爲值得總結各類可能的結果,併爲每種結果的確切行爲提供參考: 命令行
__file__
是當前正在執行的文件,如官方文檔中所述 : code
__file__
是從中加載模塊的文件的路徑名(若是它是從文件加載的)。 某些類型的模塊(例如靜態連接到解釋器的C模塊)可能缺乏__file__
屬性。 對於從共享庫動態加載的擴展模塊,它是共享庫文件的路徑名。 htm
從Python3.4起,每發行18416 , __file__
老是一個絕對路徑,除非當前正在執行的文件是已經被直接執行(不經過與解釋腳本-m
使用相對路徑命令行選項)。 ip
__main__.__file__
(須要導入__main__
)僅訪問主模塊的上述__file__
屬性,例如,從命令行調用的腳本的__file__
屬性。 文檔
sys.argv[0]
(須要導入sys
)是從命令行調用的腳本名稱,而且多是絕對路徑,如官方文檔中所述 :
argv[0]
是腳本名稱(是否爲完整路徑名取決於操做系統)。 若是命令是使用解釋器的-c
命令行選項執行的,則argv[0]
設置爲字符串'-c'
。 若是沒有腳本名稱傳遞給Python解釋器,則argv[0]
爲空字符串。
如對此問題的另外一個答案所述,經過使用py2exe或PyInstaller之類的工具轉換爲獨立可執行程序的Python腳本在使用此方法時可能不會顯示所需的結果(即sys.argv[0]
將保留名稱爲可執行文件,而不是該可執行文件中主要Python文件的名稱)。
若是上述選項彷佛都不起做用,多是因爲不規則的導入操做形成的,那麼檢查模塊可能會證實是有用的。 特別是,調用inspect.getfile()
上inspect.currentframe()
能夠工做,儘管後者將返回None
在Python中沒有堆棧幀的實現運行時。
能夠在上述任何一項上調用os.path.basename()
以便提取實際的文件名,而能夠在實際的文件名上調用os.path.splitext()
以便截斷其後綴。
從Python 3.4開始,根據PEP 428 ,也可使用pathlib
模塊的PurePath
類 。 具體來講, pathlib.PurePath().name
提取實際的文件名, pathlib.PurePath().stem
提取不帶後綴的實際文件名。
sys中的第一個參數是當前文件名,所以可使用
import sys print sys.argv[0] # will print the file name
使用__file__
。 若是要省略目錄部分(可能存在),則可使用os.path.basename(__file__)
。