Как мне найти имя файла, который является импортером, в импортированном файле?

Как мне найти имя файла, который является «импортером», в импортированном файле?

Если a.py и b.py оба импортируют c.py, может ли c.py узнать имя импортирующего его файла?


person Walking Wiki    schedule 21.09.2009    source источник
comment
Если вы хотите знать оба имени, ответ — нет; второй импорт просто вытащит ссылку на существующий модуль. Это не более чем задание.   -  person Glenn Maynard    schedule 22.09.2009


Ответы (4)


На верхнем уровне c.py (т. е. вне какой-либо функции или класса) вы должны иметь возможность получить необходимую информацию, запустив

import traceback

а затем изучить результат traceback.extract_stack(). Во время выполнения кода верхнего уровня импортер модуля (и его импортер и т. д. рекурсивно) находятся в стеке вызовов.

person Phil    schedule 21.09.2009
comment
Спасибо, Фил, это самое близкое к тому, что мне нужно. Я бы отметил это как полезное, но мне не хватает необходимых очков повторения. :) - person Walking Wiki; 25.09.2009

Вот почему у вас есть параметры.

В обязанности c.py не входит определение того, кто его импортировал.

Задача a.py или b.py состоит в том, чтобы передать переменную __name__ функциям или классам в c.py.

person S.Lott    schedule 22.09.2009
comment
Вы представляете хороший аргумент и метод, но мой код требует действия (переопределения метода) сразу после выполнения импорта. Для простоты я хотел, чтобы ссылка находилась автоматически вместо вызова класса с параметром name после строки импорта. - person Walking Wiki; 22.09.2009

Использовать

системный путь[0]

возвращает путь к скрипту, который запустил интерпретатор Python. Если вы можете запустить этот скрипт напрямую, он вернет путь к скрипту. Однако если сценарий был импортирован из другого сценария, он вернет путь к этому сценарию.

См. раздел Проблемы с Python Path.

person Dave    schedule 22.09.2009

Это можно сделать, проверив стек:

#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)

person Steven Kryskalla    schedule 21.09.2009
comment
Не только может содержать ошибки, но и не будет работать должным образом, поскольку модуль будет оцениваться только один раз, даже если он импортирован несколько раз. - person Charles Duffy; 22.09.2009