Sub*_*niC 344 python scripting basename
我正在尝试获取当前正在运行的Python脚本的名称.
例如,我有一个调用的脚本foo.py
,我想在其中执行类似的操作:
print Scriptname
Run Code Online (Sandbox Code Playgroud)
得到:foo.py
.
Sve*_*ach 534
使用__file__
.如果要省略目录部分(可能存在),则可以使用os.path.basename(__file__)
.
Chr*_*gan 121
import sys
print sys.argv[0]
Run Code Online (Sandbox Code Playgroud)
这将打印foo.py
for python foo.py
,dir/foo.py
for python dir/foo.py
等.这是第一个参数python
.(注意,在py2exe之后它会是foo.exe
.)
Amb*_*jak 63
请注意,__file__
将提供此代码所在的文件,该文件可以导入,与正在解释的主文件不同.要获取主文件,可以使用特殊的__main__模块:
import __main__ as main
print(main.__file__)
Run Code Online (Sandbox Code Playgroud)
请注意,它__main__.__file__
适用于Python 2.7,但不适用于3.2,因此请使用上面的import-as语法使其可移植.
Yoe*_*oel 57
为了完整起见,我认为值得总结各种可能的结果并为每个的确切行为提供参考:
__file__
是当前正在执行的文件,详见官方文档:
__file__
是加载模块的文件的路径名,如果它是从文件加载的.__file__
某些类型的模块可能缺少该属性,例如静态链接到解释器的C模块; 对于从共享库动态加载的扩展模块,它是共享库文件的路径名.
从Python3.4起,每发行18416,__file__
始终是一个绝对路径,除非当前正在执行的文件是已经被直接执行(不通过与解释脚本-m
使用相对路径命令行选项).
__main__.__file__
(需要导入__main__
)只需访问主模块的上述__file__
属性,例如从命令行调用的脚本.
sys.argv[0]
(需要导入sys
)是从命令行调用的脚本名称,可能是绝对路径,如官方文档中所述:
argv[0]
是脚本名称(取决于操作系统是否为完整路径名).如果使用-c
解释器的命令行选项执行命令,argv[0]
则将其设置为字符串'-c'
.如果没有脚本名称传递给Python解释器,argv[0]
则为空字符串.
正如提到的另一个回答这个问题,Python的是被通过的工具,如转换成独立的可执行程序的脚本py2exe或PyInstaller使用这种方法时,可能不会显示期望的结果(即sys.argv[0]
将举行的可执行文件的名称,而不是名称该可执行文件中的主要Python文件).
inspect.getfile()
可以在上述任何一个上调用,以便提取实际的文件名.
Man*_*ahu 40
以上答案都很好.但我发现这种方法使用上述结果更有效.
这导致实际的脚本文件名不是路径.
import sys
import os
file_name = os.path.basename(sys.argv[0])
Run Code Online (Sandbox Code Playgroud)
Emi*_*kov 12
对于现代Python版本,Path(__file__).name
应该更加惯用.此外,Path(__file__).stem
为您提供没有.py
扩展名的脚本名称.
小智 8
我们可以尝试这样做来获取当前的脚本名称,不带扩展名。
import os
script_name = os.path.splitext(os.path.basename(__file__))[0]
Run Code Online (Sandbox Code Playgroud)
您可以在不导入操作系统或其他库的情况下执行此操作。
如果你想获取当前python脚本的路径,请使用:__file__
如果您只想获取不带 .py 扩展名的文件名,请使用以下命令:
__file__.rsplit("/", 1)[1].split('.')[0]
Run Code Online (Sandbox Code Playgroud)
sys中的第一个参数将是当前文件名,因此这将起作用
import sys
print sys.argv[0] # will print the file name
Run Code Online (Sandbox Code Playgroud)
假设文件名是foo.py
,下面的代码片段
import sys
print sys.argv[0][:-3]
Run Code Online (Sandbox Code Playgroud)
要么
import sys
print sys.argv[0][::-1][3:][::-1]
Run Code Online (Sandbox Code Playgroud)
将输出 foo.pypy
如果您正在进行异常导入(例如,它是选项文件),请尝试:
import inspect
print (inspect.getfile(inspect.currentframe()))
Run Code Online (Sandbox Code Playgroud)
请注意,这将返回文件的绝对路径.
从 Python 3.5 开始,您可以简单地执行以下操作:
from pathlib import Path
Path(__file__).stem
Run Code Online (Sandbox Code Playgroud)
在此处查看更多信息:https : //docs.python.org/3.5/library/pathlib.html#pathlib.PurePath.stem
例如,我的用户目录下有一个文件,test.py
里面用这个命名:
from pathlib import Path
print(Path(__file__).stem)
print(__file__)
Run Code Online (Sandbox Code Playgroud)
运行此输出:
>>> python3.6 test.py
test
test.py
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
257488 次 |
最近记录: |