Как получить путь из имени модуля Python, если модуль не существует?

Получить путь к файловой системе модуля Python по имени модуля легко, если модуль существует. Например вот так:

importlib.machinery.PathFinder.find_module('my.module').path

Но когда модуль не существует, как я могу получить теоретический путь, который будет использоваться для проверки существования модуля?

Предыстория: я хочу следить за тем, чтобы файловая система уведомлялась о появлении модуля (указанного именем модуля, например, в операторе импорта).


person saluto    schedule 13.12.2020    source источник
comment
Отвечает ли это на ваш вопрос? Где хранятся модули Python?   -  person wjandrea    schedule 14.12.2020


Ответы (1)


Python использует собственную переменную path, чтобы знать, где искать модули. Переменная path представляет собой список, содержащий все каталоги, в которых python ищет модули, от начала до конца. Чтобы взглянуть на это, вы можете использовать модуль sys:

import sys

print(sys.path)

Первый элемент в списке — это каталог сценария, если вы не находитесь в интерактивном сеансе, и в этом случае будет присутствовать пустая строка, представляющая текущий рабочий каталог.

person tralph3    schedule 13.12.2020
comment
Пустая строка на самом деле означает рабочий каталог. Из документов: Как инициализировано при запуске программы , первый элемент этого списка, path[0], — это каталог, содержащий сценарий, который использовался для вызова интерпретатора Python. Если каталог сценария недоступен, path[0] — это пустая строка, которая указывает Python сначала искать модули в текущем каталоге. (выделено жирным шрифтом) - person wjandrea; 14.12.2020
comment
Ну вот что я хотел сказать. Спасибо за разъяснение, я отредактирую ответ. - person tralph3; 14.12.2020
comment
О, это еще не совсем так. Python попытается добавить каталог, содержащий скрипт, но если он не сможет, как в интерактивном сеансе, тогда он добавит пустую строку. - person wjandrea; 14.12.2020
comment
Хорошо, понял, спасибо. - person tralph3; 14.12.2020
comment
Спасибо. Итак, должен ли я рекурсивно отслеживать все пути в sys.path на наличие изменений? Возможно, пути можно было бы сделать немного более конкретными, добавив к каждому из них имя модуля, где точки заменены на /. Может ли это сработать? Есть ли лучший способ, возможно, с использованием существующей функции из стандартной библиотеки Python? Мне нужно как можно меньше наблюдателей за файлами из-за ограничений ОС и памяти. - person saluto; 14.12.2020