使用Python获取当前脚本的名称

Get the name of current script with Python

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

例如,我有一个名为foo.py的脚本,我想在其中执行类似的操作:

1
print Scriptname

得到:foo.py


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


1
2
import sys
print sys.argv[0]

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


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

1
2
import __main__ as main
print(main.__file__)

请注意,__main__.__file__适用于Python 2.7,但不适用于3.2,因此请使用上面的import-as语法使其可移植。


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

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

    __file__ is the pathname of the file from which the module was loaded, if it was loaded from a file. The __file__ attribute may be missing for certain types of modules, such as C modules that are statically linked into the interpreter; for extension modules loaded dynamically from a shared library, it is the pathname of the shared library file.

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

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

  • sys.argv[0](需要导入sys)是从命令行调用的脚本名称,可能是绝对路径,如官方文档中所述:

    argv[0] is the script name (it is operating system dependent whether this is a full pathname or not). If the command was executed using the -c command line option to the interpreter, argv[0] is set to the string '-c'. If no script name was passed to the Python interpreter, argv[0] is the empty string.

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

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


以上答案都很好。但我发现这种方法使用上述结果更有效。
这导致实际的脚本文件名不是路径。

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


试试这个:

1
print __file__


sys中的第一个参数将是当前文件名,因此这将起作用

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

对于现代Python版本,Path(__file__).name应该更加惯用。此外,Path(__file__).stem为您提供不带.py扩展名的脚本名称。


如果您正在进行异常导入(例如,它是选项文件),请尝试:

1
2
import inspect
print (inspect.getfile(inspect.currentframe()))

请注意,这将返回文件的绝对路径。


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

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

要么

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

将输出foo


os.path.abspath(__file__)将为您提供绝对路径(relpath()也可用)。

sys.argv[-1]会给你一个相对路径。


我的快速解决方案:

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