例如,a.boo
方法调用b.foo
方法。在b.foo
方法中,如何获取文件名(我不想将__file__
传递给b.foo
方法)...
答案 0 :(得分:30)
您可以使用inspect
模块来实现此目的:
frame = inspect.stack()[1]
module = inspect.getmodule(frame[0])
filename = module.__file__
答案 1 :(得分:7)
要获取完整的文件名(带有路径和文件扩展名),请在被调用方中使用:
import inspect
filename = inspect.stack()[1].filename
要检索呼叫者的文件名,请使用inspect.stack()。此外,以下代码还修剪完整文件名开头的路径和文件扩展名的结尾:
# Callee.py
import inspect
import os.path
def get_caller_info():
# first get the full filename (including path and file extension)
caller_frame = inspect.stack()[1]
caller_full_filename = caller_frame.filename
# now get rid of the directory and file extension
caller_filename = os.path.splitext(os.path.basename(caller_full_filename))[0]
# return all info as tuple
return caller_full_filename, caller_filename
然后可以像这样使用它:
# Caller.py
import callee
full_filename, filename = callee.get_caller_info()
print(f"> Full filename: {full_filename}")
print(f"> Short filename: {filename}")
# Output
# > Full filename: /workspaces/python/caller_filename/caller.py
# > Short filename: caller
其他来源:
答案 2 :(得分:3)
受到ThiefMaster的回答的启发,但是如果inspect.getmodule()
返回None
也可以起作用:
frame = inspect.stack()[1]
filename = frame[0].f_code.co_filename
答案 3 :(得分:1)
您可以使用traceback
模块:
import traceback
你可以像这样打印背面痕迹:
print traceback.format_exc()
多年来我没有用过这个,但这应该足以让你开始。
答案 4 :(得分:0)
阅读所有这些解决方案,看来这也可行吗?
import inspect
print inspect.stack()[1][1]
框架中的第二项已经是调用者的文件名,还是不够可靠?
答案 5 :(得分:0)
这可以通过inspect
模块,特别是inspect.stack
模块来完成:
import inspect
import os.path
def get_caller_filepath():
# get the caller's stack frame and extract its file path
frame_info = inspect.stack()[1]
filepath = frame_info[1] # in python 3.5+, you can use frame_info.filename
del frame_info # drop the reference to the stack frame to avoid reference cycles
# make the path absolute (optional)
filepath = os.path.abspath(filepath)
return filepath
演示:
import b
print(b.get_caller_filepath())
# output: D:\Users\Aran-Fey\a.py