Как получить имя вызывающего файла, имя метода в python

например, метод a.boo вызывает метод b.foo. В методе b.foo, как я могу получить имя файла (я не хочу передавать метод __file__ в b.foo)...

Ответ 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