用Python获取当前脚本的名称

我正在尝试获取当前正在运行的Python脚本的名称。

例如,我有一个名为foo.py的脚本,我想在里面做这样的事情:

 print Scriptname 

并得到: foo.py

使用__file__ 。 如果你想省略目录部分(可能存在),你可以使用os.path.basename(__file__)

 import sys print sys.argv[0] 

这将打印foo.pypython foo.pydir/foo.pypython dir/foo.py等。这是python的第一个参数。 (请注意,在py2exe之后,它将是foo.exe 。)

请注意, __file__将提供此代码所在的文件,这些文件可以被导入,并且与正在解释的主文件不同。 要获得主文件,可以使用特殊的__main__模块:

 import __main__ as main print(main.__file__) 

请注意, __main__.__file__在Python 2.7中工作,但不在3.2中,所以使用上面的import-as语法来使其具有可移植性。

上面的答案是好的。 但是我发现这个方法使用上面的结果更有效率。
这会导致实际的脚本文件名称不是path。

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

为了完整起见,我认为总结各种可能的结果并为每一种可能的结果提供参考是值得的:

  • __file__是当前正在执行的文件,详见官方文档 :

    __file__是从模块加载的文件的path名,如果它是从文件加载的。 某些types的模块可能缺less__file__属性,例如静态链接到解释器的C模块; 对于从共享库dynamic加载的扩展模块,它是共享库文件的path名。

    从Python3.4开始,每个问题18416 , __file__总是一个绝对path,除非当前正在执行的文件是使用相对path直接执行的脚本(不是通过带-m命令行选项的解释器)。

  • __main__.__file__ (需要导入__main__ )只是访问主模块的上述__file__属性,例如从命令行调用的脚本。

  • sys.argv[0] (需要导入sys )是从命令行调用的脚本名称,可能是绝对path,详见官方文档 :

    argv[0]是脚本名称(不pipe它是否是完整的path名,它取决于操作系统)。 如果使用解释器的-c命令行选项执行命令, argv[0]被设置为string'-c' 。 如果没有脚本名称被传递给Python解释器, argv[0]是空string。

    正如在这个问题的另一个答案中提到的那样,通过py2exePyInstaller等工具转换为独立可执行程序的Python脚本在使用这种方法时可能不会显示所需的结果(即, sys.argv[0]将保存可执行文件,而不是该可执行文件中主Python文件的名称)。


os.path.basename()可以调用上面的任何一个以提取实际的文件名。

尝试这个:

 print __file__ 

在sys中的第一个参数将是当前的文件名,所以这将工作

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

假设文件名是foo.py ,下面的代码片断

 import sys print sys.argv[0][:-3] 

要么

 import sys print sys.argv[0][::-1][3:][::-1] 

会输出foo

我的快速脏解决scheme:

 __file__.split('/')[-1:][0] 

这对Python 3.6的工作

 import inspect, os print (inspect.getfile(inspect.currentframe()))