Как мне найти имя файла, который является «импортером», в импортированном файле?
Если a.py
и b.py
оба импортируют c.py
, может ли c.py узнать имя импортирующего его файла?
Как мне найти имя файла, который является «импортером», в импортированном файле?
Если a.py
и b.py
оба импортируют c.py
, может ли c.py узнать имя импортирующего его файла?
На верхнем уровне c.py (т. е. вне какой-либо функции или класса) вы должны иметь возможность получить необходимую информацию, запустив
import traceback
а затем изучить результат traceback.extract_stack(). Во время выполнения кода верхнего уровня импортер модуля (и его импортер и т. д. рекурсивно) находятся в стеке вызовов.
Вот почему у вас есть параметры.
В обязанности c.py
не входит определение того, кто его импортировал.
Задача a.py
или b.py
состоит в том, чтобы передать переменную __name__
функциям или классам в c.py
.
Использовать
системный путь[0]
возвращает путь к скрипту, который запустил интерпретатор Python. Если вы можете запустить этот скрипт напрямую, он вернет путь к скрипту. Однако если сценарий был импортирован из другого сценария, он вернет путь к этому сценарию.
См. раздел Проблемы с Python Path.
Это можно сделать, проверив стек:
#inside c.py:
import inspect
FRAME_FILENAME = 1
print "Imported from: ", inspect.getouterframes(inspect.currentframe())[-1][FRAME_FILENAME]
#or:
print "Imported from: ", inspect.stack()[-1][FRAME_FILENAME]
Но проверка стека может быть ошибочной. Зачем нужно знать, откуда импортируется файл? Почему бы не передать имя файла, который импортирует (a.py
и b.py
), в c.py
? (при условии, что вы контролируете a.py
и b.py
)