например, метод a.boo вызывает метод b.foo. В методе b.foo, как я могу получить имя файла (я не хочу передавать метод __file__ в b.foo)...
Как получить имя вызывающего файла, имя метода в python
Ответ 1
Для этого вы можете использовать модуль inspect:
frame = inspect.stack()[1]
module = inspect.getmodule(frame[0])
filename = module.__file__
Ответ 2
Вдохновлен ответом ThiefMaster, но работает также, если inspect.getmodule() возвращает None:
frame = inspect.stack()[1]
filename = frame[0].f_code.co_filename
Ответ 3
Вы можете использовать модуль traceback:
import traceback
и вы можете распечатать обратную трассировку следующим образом:
print traceback.format_stack()
Я не использовал это годами, но этого должно быть достаточно, чтобы вы начали.
Ответ 4
Читая все эти решения, кажется, это тоже работает?
import inspect
print inspect.stack()[1][1]
Второй элемент во фрейме уже является именем файла вызывающего абонента или это не надежно?
Ответ 5
Это можно сделать с помощью модуля inspect, в частности inspect.stack:
import inspect
import os.path
def get_caller_filepath():
# get the caller 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