Получить имя из файла Python, который называется импорт - PullRequest
0 голосов
/ 13 сентября 2018

Я искал его в интернете, но пока не смог найти ответ.

У меня есть одна библиотека, которая импортируется в любой другой файл. скажем, библиотека импортируется как import my_lib в файлах, которые его используют.

в mylib Я хотел бы сделать что-то вроде __imported_from__, чтобы код знал, откуда идет импорт. Мне это нужно для целей регистрации (другой вызов другой файл журнала / логин)

Это будет журнал на данный момент:

2018-09-13 01:36:00,921 - my_lib - INFO - Start Processing
2018-09-13 01:36:30,921 - my_lib - INFO - Done Processing
2018-09-13 01:37:00,921 - my_lib - INFO - Start Processing
2018-09-13 01:37:30,921 - my_lib - INFO - Done Processing

Я хочу, чтобы my_lib содержал имя из импортированного файла, чтобы в моем журнале можно было видеть, откуда поступил вызов. Как в примере ниже

2018-09-13 01:36:00,921 - import_from_file_1 - INFO - Start Processing
2018-09-13 01:36:30,921 - import_from_file_1 - INFO - Done Processing
2018-09-13 01:37:00,921 - import_from_file_2 - INFO - Start Processing
2018-09-13 01:37:30,921 - import_from_file_2 - INFO - Done Processing

Основываясь на ответе, я написал 2 строки, которые предоставляют мне данные, которые я хочу:

import inspect
from os.path import basename, splitext
imported_from_file = (inspect.stack()[1][1]) if __name__ != '__main__' else False
used_from = splitext(basename(imported_from_file))[0] if imported_from_file else __name__

1 Ответ

0 голосов
/ 13 сентября 2018

В импортируемом файле вы можете проверить стек и получить первое имя файла в кадрах (после пропуска первого кадра, который является текущим кадром), которое не начинается с <, что обозначает внутреннюю библиотеку:

import inspect
if __name__ != '__main__':
    for frame in inspect.stack()[1:]:
        if frame.filename[0] != '<':
            print(frame.filename)
            break

Если вы используете Python 2.7, вам следует вместо этого использовать второй элемент кортежа фреймов.Фактически в Python 2.7 модуль, выполняющий импорт, всегда находится во втором фрейме, поэтому вы можете просто сделать:

import inspect
if __name__ != '__main__':
    print(inspect.stack()[1][1])
...