Получить путь импорта функции

from pack.mod import f 

Как получить от объекта f информацию об импорте – 'pack.mod'

Я могу получить его с помощью f.__module__ но если функция def в модуле, где я получаю этот атрибут ( f.__module__ ), он возвращает '__main__' . Но мне нужен реальный путь здесь – 'pack.mod'

Я нашел этот способ, чтобы получить эту информацию:

 inspect.getmodule(f).__file__ 

то я могу запустить путь запуска из sys.path , replace / on . и получить путь как 'pack.mod' Но может ли существовать более удобный способ?

2 Solutions collect form web for “Получить путь импорта функции”

То, что inspect.getmodule(f) внутри, в источниках inspect.py , по существу, является sys.modules.get(object.__module__) – я бы не вызвал использование этого кода непосредственно «более удобно», хотя (помимо «по существу» «часть, inspect имеет много полезного лова и исправления угловых случаев».

Почему бы не вызвать непосредственно inspect.getsourcefile (f) ?

Изменить : чтение между строками, которые, по-видимому, пытается сделать

 python /foo/bar/baz/bla.py 

и внутри bla.py (который, таким образом, выполняется как __main__ ), определяет «что from инструкции или import может использовать другой основной скрипт для импорта этой функции изнутри меня?».

Проблема в том, что вопрос неверен, потому что не может быть такого пути, который можно использовать для этой цели (ничто не гарантирует, что путь текущего основного скрипта находится на sys.path когда этот другой основной скрипт запускается позже), может быть несколько разных (например, оба /foo/bar и /foo/bar/baz могут быть на sys.path и /foo/bar/baz/__init__.py существуют, и в этом случае from baz.bla import f и from bla import f могут оба работа), и ничто не гарантирует, что какой-то другой предыдущий элемент sys.path не сможет «упредить» попытку импорта (например, say /foo/bar/baz находится на sys.path , но перед этим есть также /fee/fie/foo , а также полностью несвязанный файл /fee/fie/foo/bla.py также существует – и т. д. и т. д.).

Какова бы ни была цель такого рода попыток обнаружения, я предлагаю найти альтернативную архитектуру, например, где from baz.bla import f фактически выполняется (как говорит OP в начале вопроса), так что f.__module__ is правильно настроен на baz.bla .

Вы хотите использовать атрибут __name__ из __module__ :

 In [16]: import inspect In [17]: inspect.getmodule(MyObject).__name__ Out[17]: 'lib.objects.MyObject' 
  • Объявить функцию в конце файла в Python
  • python: как получить информацию о функции?
  • Значения по умолчанию для аргументов
  • смещение букв с помощью ord и chr
  • Python Class Based Decorator с параметрами, которые могут украсить метод или функцию
  • Методы расширения в Python
  • Как использовать * args в функции?
  • Определить имя функции из этой функции (без использования трассировки)
  • Python - лучший язык программирования в мире.