我有两个脚本:
main.py
import package.py
package.py
import os
print(os.path.basename(_file_))
我的预期输出是
main.py
,但我得到
package.py
那么我如何在包脚本中获取正在运行的脚本的文件名?
额外描述 :
事实是,我在
package.py
中有一个装饰器函数。它将在当前路径生成一个文件,并以调用它的文件名命名。
可以使用
inspect
模块来获取导入包中运行脚本的文件名。
以下是修改后的
package.py
代码:
import os
import inspect
def get_caller_filename():
"""获取调用者文件名."""
frame = inspect.stack()[2]
module = inspect.getmodule(frame[0])
filename = module.__file__
return os.path.basename(filename)
def my_decorator(func):
def wrapper(*args, **kwargs):
caller_filename = get_caller_filename()
print(f"调用脚本的文件名: {caller_filename}")
# 在此处使用 caller_filename 生成文件
return func(*args, **kwargs)
return wrapper
解释:
-
inspect.stack()
: 此函数返回调用堆栈的列表,每个元素代表一个堆栈帧。 -
inspect.stack()[2]
: 我们获取堆栈列表中的第三个元素(索引为 2),因为它代表调用get_caller_filename()
函数的函数的调用信息。第一个元素是get_caller_filename()
本身,第二个是my_decorator
的wrapper
函数。 -
inspect.getmodule(frame[0])
: 从堆栈帧中获取模块对象。 -
module.__file__
: 获取模块的文件路径。 -
os.path.basename(filename)
: 从文件路径中提取文件名。
现在,当你在
main.py
中调用
package.py
中的函数时,
get_caller_filename()
函数将返回
main.py
作为调用脚本的文件名.
注意:
-
这种方法依赖于调用堆栈,因此如果在
package.py
中的多个层级函数调用之间传递调用信息,则需要相应地调整inspect.stack()
的索引。 -
确保
package.py
被main.py
导入,而不是直接运行。