Исходя из этого ответа с использованием модуля traceback
, этот код должен работать для вашего примера.
main.py
import traceback
if __name__ == '__main__':
print(__name__)
else:
stack = traceback.extract_stack()
print(stack[0].filename)
Обратите внимание, что просто захват Стек 0 работает, только если у вас есть только один слой импорта. Если у вас есть несколько уровней импорта, вам нужно работать обратно вверх по стеку, чтобы извлечь немедленный импорт.
Если у вас несколько уровней импорта, этот код должен получить файл, выполняющий немедленный импорт.
import traceback
if __name__ == '__main__':
print(__name__)
else:
stack = traceback.extract_stack()
modules = [x for x in stack if 'importlib' not in x.filename]
print(modules[-2].filename)
Обратите внимание, что модуль трассировки включает в себя несколько слоев importlib, импортирующих модуль, поэтому он отфильтровывает эти первые и ссылается на второй-последний модуль, поскольку последний модуль будет main.py, а второй - последним модуль, выполняющий немедленный импорт.