Как получить путь к модулю?
Проблема: Я хочу обнаружить, изменился ли модуль. В данный момент использование inotify довольно простое, нужно лишь знать директорию, от которой вы хотите получать уведомления.
Вопрос: Как мне получить путь к модулю в Python?
5 ответ(ов)
Команда
import a_module
print(a_module.__file__)
действительно выдаст путь к загруженному .pyc файлу, по крайней мере, на Mac OS X. Таким образом, вы можете сделать следующее:
import os
path = os.path.abspath(a_module.__file__)
Также вы можете попробовать:
path = os.path.dirname(a_module.__file__)
чтобы получить директорию модуля.
Как уже упоминали другие ответы, лучший способ сделать это — использовать __file__
(что снова демонстрируется ниже). Однако есть важное замечание: __file__
НЕ существует, если вы запускаете модуль самостоятельно (т.е. как __main__
).
Например, предположим, что у вас есть два файла (оба находятся в вашем PYTHONPATH):
#/path1/foo.py
import bar
print(bar.__file__)
и
#/path2/bar.py
import os
print(os.getcwd())
print(__file__)
Запуск foo.py
даст следующий вывод:
/path1 # "import bar" вызывает выполнение строчки "print(os.getcwd())"
/path2/bar.py # затем выполняется "print(__file__)"
/path2/bar.py # затем завершится оператор импорта и выполнится "print(bar.__file__)"
ОДНАКО, если вы попытаетесь запустить bar.py
самостоятельно, вы получите:
/path2 # "print(os.getcwd())" работает нормально
Traceback (most recent call last): # но __file__ не существует, если bar.py запущен как главный модуль
File "/path2/bar.py", line 3, in <module>
print(__file__)
NameError: name '__file__' is not defined
Надеюсь, это поможет. Это замечание стоило мне много времени и путаницы, когда я тестировал другие представленные решения.
Это было тривиально.
Каждый модуль имеет переменную __file__
, которая показывает его относительный путь от вашего текущего местоположения.
Поэтому получить директорию модуля для уведомления о ней просто:
os.path.dirname(__file__)
Ваш код на Python позволяет получить путь к каталогу, в котором находится исполняемый файл. Давайте разберем его по частям:
import os
— импортирует модульos
, который предоставляет функциональность для работы с файловой системой.path = os.path.abspath(__file__)
— эта строка получает абсолютный путь к текущему исполняемому файлу. Переменная__file__
содержит путь к файлу, который выполняется, а функцияos.path.abspath()
преобразует его в абсолютный путь.dir_path = os.path.dirname(path)
— здесь мы используем функциюos.path.dirname()
, чтобы извлечь каталог из полного пути, полученного на предыдущем шаге. В результатеdir_path
будет содержать путь к каталогу, в котором находится ваш исполняемый файл.
Таким образом, итоговый код позволяет эффективно находить путь к директории, где расположен скрипт.
Если вы хотите получить путь к модулю без его загрузки, вы можете использовать следующий код:
import importlib.util
print(importlib.util.find_spec("requests").origin)
Пример вывода:
/usr/lib64/python3.9/site-packages/requests/__init__.py
Этот метод позволяет получить информацию о модуле, не загружая его в память, что может быть полезно для оптимизации производительности или для получения информации о модуле перед его использованием.
Как разгрузить (перезагрузить) модуль Python?
Импорт модулей из родительской папки
Почему используется string.join(list), а не list.join(string)?
Создание словаря с помощью генератора словарей
Найти все файлы с расширением .txt в директории на Python