Получить полное имя модуля пакета

Для подробных отладочных сообщений в моем приложении я использую функцию, которая возвращает полезный префикс. Рассмотрим следующий пример:

import inspect

def get_verbose_prefix():
    """Returns an informative prefix for verbose debug output messages"""
    s = inspect.stack()
    module_name = inspect.getmodulename(s[1][1])
    func_name = s[1][3]

    return '%s->%s' % (module_name, func_name)

def awesome_function_name():
    print "%s: Doing some awesome stuff right here" % get_verbose_prefix()

if __name__ == '__main__':
    awesome_function_name()

Это выводит:

test->awesome_function_name: Doing some awesome stuff right here

Моя проблема: когда у меня есть модуль в пакете, например "myproject.utilities.input", имя модуля, возвращаемое из get_verbose_prefix, по-прежнему просто "input", а не "myproject.utilities.input". '. Это резко снижает полезность префикса в больших проектах, когда может быть несколько «входных» модулей в разных подмодулях, работающих вместе.

Итак, мой вопрос: есть ли простой способ получить полное имя модуля в его пакете в Python? Я планирую расширить функцию get_verbose_prefix для проверки файлов __init__.py в родительских каталогах модуля, чтобы экстраполировать его полное имя, но сначала я хотел бы знать, есть ли более простой способ сделать это.


person Hubro    schedule 28.07.2012    source источник
comment
Примечание: в контексте упаковки Python имя пакета ≠ путь импорта. Пакеты могут содержать модули и пространства имен, которые не обязательно называются в честь самого пакета.   -  person Błażej Michalik    schedule 21.08.2020


Ответы (3)


__name__ всегда содержит полное имя модуля. (Кроме __main__ на главной, конечно.)

person unddoch    schedule 28.07.2012
comment
Я предполагаю, что это правда, но как мне добраться до фактического модуля из контекста моей префиксной функции? - person Hubro; 29.07.2012
comment
Неважно, я понял это: inspect.getmodule(s[1][0]).__name__. Также вы должны отредактировать, что __name__ на самом деле не всегда возвращает полное имя модуля, поскольку он возвращает __main__ для исполняемого модуля. - person Hubro; 29.07.2012
comment
Что такое s в inspect.getmodule(s[1][0]).__name__? - person Quentin Roy; 22.06.2017
comment
@КвентинРой s = inspect.stack() - person 0x416e746f6e; 11.08.2017
comment
То чувство, когда скрытый комментарий спрашивающего отвечает на вопрос лучше, чем любой из реальных ответов. - person Cecil Curry; 03.01.2019

Попробуйте использовать атрибут __name__ модуля.

person BrenBarn    schedule 28.07.2012

Простой способ получить полное имя модуля в его пакете:

print(__file__)
person Tung Nguyen    schedule 27.05.2016