Как получить имя файла, который импортирует его в Python - PullRequest
1 голос
/ 27 марта 2020

У меня есть 3 файла, main.py , module2.py и module3.py .

Как module2.py, так и module3.py импортируют main.py. Мне было интересно, есть ли способ выяснить, какой файл импортирует main.py.

Чтобы показать, чего я пытаюсь достичь с помощью кода, это то, что я хотел бы сделать с main.py:

if __name__ == '__main__':
    print(__name__)
else:
    print(name_of_the_file_that_is_importing_me) # module2 or module3

Я нашел несколько ответов, таких как этот , который довольно устарел и не совсем так, как я хотел бы.

Я надеюсь, что вопрос имеет смысл и заранее всем спасибо!

1 Ответ

2 голосов
/ 27 марта 2020

Исходя из этого ответа с использованием модуля 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, а второй - последним модуль, выполняющий немедленный импорт.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...