Где импортируется модуль?
Предполагая, что у меня есть два модуля Python, а путь path_b находится в пути импорта:
# file: path_b/my_module.py
print "I was imported from ???"
#file: path_a/app.py
import my_module
Можно ли увидеть, откуда импортируется модуль? Я хочу, чтобы результат вроде "Я был импортирован из path_a/app.py", если я запустил app.py(потому что мне нужно имя файла).
Edit:
Для лучшего понимания; Я мог бы написать:
# file: path_b/my_module.py
def foo(file):
print "I was imported from %s" % file
#file: path_a/app.py
import my_module
my_module.foo(__file__)
Таким образом, выход будет:
$> python path_app.py
I was imported from path_a/app.py
Ответы
Ответ 1
Там может быть более простой способ сделать это, но это работает:
import inspect
print inspect.getframeinfo(inspect.getouterframes(inspect.currentframe())[1][0])[0]
Обратите внимание, что путь будет напечатан относительно текущего рабочего каталога, если он является родительским каталогом местоположения script.
Ответ 2
Попробуйте следующее:
>>> import my_module
>>> my_module.__file__
'/Users/myUser/.virtualenvs/foobar/lib/python2.7/site-packages/my_module/__init__.pyc'
Изменить
В этом случае напишите в файл __init__.py
вашего модуля:
print("%s: I was imported from %s" %(__name__, __file__))
Ответ 3
Попробуйте my_module.__file__
, чтобы узнать, откуда он. Если вы получаете AttributeError
, это, вероятно, не файл источника Python (.py).
Ответ 4
Кроме того, если у вас есть функция/класс f
из модуля m
, вы можете получить путь к модулю с помощью модуля inspect
import inspect
from m import f
print inspect.getmodule(f)
Ответ 5
Если вы хотите увидеть, где хранится модуль, например, setuptools
, введите shell:
$ python -c "import setuptools; print(setuptools.__file__)"
Ответ 6
Я написал простой скрипт, поэтому у меня есть команда pywhich
которая позволяет мне найти источник Python-модуля. Он не работает для некоторых встроенных программ, таких как sys, у которых нет атрибута \__file__
.
Это можно запустить из командной строки Linux, чтобы определить, откуда скрипт Python, запущенный в текущей среде, получит модуль, например:
% pywhich os
#! /usr/bin/env python
def pywhich(module_name):
module = __import__(module_name, globals(), locals(), [], -1)
return module.__file__
if __name__ == "__main__":
import sys
print(pywhich(sys.argv[1]))
Ответ 7
Вот как я это делаю:
print(module_name.__path__)
Ответ 8
Другие ответы в порядке, но если вы хотите рассказать об этом из импортированного модуля, выполните
print "I was imported from %s" % __file__