Как найти имя файла, который является импортером, в импортированном файле? - PullRequest
3 голосов
/ 22 сентября 2009

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

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

Ответы [ 4 ]

2 голосов
/ 22 сентября 2009

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

Задачей c.py не является определение того, кто ее импортировал.

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

1 голос
/ 22 сентября 2009

Используйте

sys.path [0]

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

См. Проблемы с путями Python

1 голос
/ 22 сентября 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)

1 голос
/ 22 сентября 2009

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

import traceback

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

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