Как я могу получить доступ к текущему исполняющему модулю или имени класса в Python? - PullRequest
36 голосов
/ 02 марта 2009

Я хотел бы иметь возможность динамически извлекать текущий исполняемый модуль или имя класса из импортированного модуля. Вот некоторый код:

foo.py:

def f():
    print __name__

bar.py:

from foo import f

def b(): f()

Это, очевидно, не работает, так как __name__ - это имя модуля, который содержит функцию. То, к чему я хотел бы получить доступ внутри модуля foo, - это имя текущего исполняющего модуля, который использует foo. Таким образом, в приведенном выше случае это будет bar, но если какой-либо другой импортированный модуль foo, я бы хотел, чтобы foo динамически имел доступ к имени этого модуля.

Редактировать: Модуль inspect выглядит довольно многообещающе, но это не совсем то, что я искал. Я надеялся на какую-то глобальную переменную или переменную уровня среды, к которой я мог получить доступ, которая содержала бы имя текущего исполняемого модуля. Не то чтобы я не хотел проходить через стек, чтобы найти эту информацию - я просто подумал, что Python, возможно, уже раскрыл эти данные.

Редактировать: Вот как я пытаюсь использовать это. У меня есть два разных приложения Django, которые оба должны регистрировать ошибки в файл. Допустим, они называются «AppOne» и «AppTwo». У меня также есть место, куда я хотел бы зайти в эти файлы: "/home/hare/app_logs". В каждом приложении в любой данный момент я хотел бы иметь возможность импортировать мой модуль логгера и вызывать функцию log, которая записывает строку журнала в файл. Однако я хотел бы создать каталог под app_logs, который является именем текущего приложения («AppOne» или «AppTwo»), чтобы файлы журналов каждого приложения помещались в соответствующие каталоги журналов.

Чтобы сделать это, я подумал, что для модуля логгера лучше всего иметь доступ к некоторой глобальной переменной, которая обозначает имя текущего приложения, поскольку оно отвечает за знание местоположения родительского каталога журналирования и создание каталог журналов приложения, если он еще не существует.

Ответы [ 11 ]

0 голосов
/ 18 марта 2019

Чтобы получить текущий файловый модуль, содержащий папку, вот что у меня сработало:

 import os
 parts = os.path.splitext(__name__)
 module_name = parts[len(parts) - 2]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...