獲取Python中當前腳本的名稱

我正在嘗試獲取當前正在運行的Python腳本的名稱。 html

我有一個名爲foo.py的腳本,我想作這樣的事情以得到腳本名稱: python

print Scriptname

#1樓

請注意, __file__將提供此代碼所在的文件,該文件能夠導入,而且與要解釋的主文件不一樣。 要獲取主文件,可使用特殊的__main__模塊: 工具

import __main__ as main
print(main.__file__)

請注意, __main__.__file__在Python 2.7中有效,但在3.2中無效,所以請使用上述import-as語法使其具備可移植性。 spa


#2樓

上述答案是好的。 可是我發現使用上面的結果這種方法更有效。
這致使實際的腳本文件名不是路徑。 操作系統

import sys    
import os    
file_name =  os.path.basename(sys.argv[0])

#3樓

爲了完整起見,我認爲值得總結各類可能的結果,併爲每種結果的確切行爲提供參考: 命令行

  • __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]爲空字符串。

    對此問題的另外一個答案所述,經過使用py2exePyInstaller之類的工具轉換爲獨立可執行程序的Python腳本在使用此方法時可能不會顯示所需的結果(即sys.argv[0]將保留名稱爲可執行文件,而不是該可執行文件中主要Python文件的名稱)。

  • 若是上述選項彷佛都不起做用,多是因爲不規則的導入操做形成的,那麼檢查模塊可能會證實是有用的。 特別是,調用inspect.getfile()inspect.currentframe()能夠工做,儘管後者將返回NonePython中沒有堆棧幀的實現運行時。


提取實際文件名的進一步操做

能夠在上述任何一項上調用os.path.basename()以便提取實際的文件名,而能夠在實際的文件名上調用os.path.splitext()以便截斷其後綴。

Python 3.4開始,根據PEP 428 ,也可使用pathlib模塊PurePath 。 具體來講, pathlib.PurePath().name提取實際的文件名, pathlib.PurePath().stem提取不帶後綴的實際文件名。


#4樓

sys中的第一個參數是當前文件名,所以可使用

import sys
   print sys.argv[0] # will print the file name

#5樓

使用__file__ 。 若是要省略目錄部分(可能存在),則可使用os.path.basename(__file__)

相關文章
相關標籤/搜索