Get the name of current script with Python
我正在尝试获取当前正在运行的Python脚本的名称。
例如,我有一个名为
1 | print Scriptname |
得到:
使用
1 2 | import sys print sys.argv[0] |
这将为
请注意,
1 2 | import __main__ as main print(main.__file__) |
请注意,
为了完整起见,我认为值得总结各种可能的结果并为每个的确切行为提供参考:
-
__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文件的名称)。
可以在上述任何一个上调用
以上答案都很好。但我发现这种方法使用上述结果更有效。
这导致实际的脚本文件名不是路径。
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版本,
如果您正在进行异常导入(例如,它是选项文件),请尝试:
1 2 | import inspect print (inspect.getfile(inspect.currentframe())) |
请注意,这将返回文件的绝对路径。
假设文件名是
1 2 | import sys print sys.argv[0][:-3] |
要么
1 2 | import sys print sys.argv[0][::-1][3:][::-1] |
将输出
我的快速解决方案:
1 | __file__.split('/')[-1:][0] |