Предпочтительный способ разрешения корня пакета в Python

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

os.path.dirname(os.path.abspath(__file__))

Теперь предположим, что у меня есть пакет с некоторыми модулями, которым нужно прочитать текстовый файл, расположенный в подкаталоге. Что-то вроде этого:

|-- package
|   |-- __init__.py
|   |-- module1.py
|   |-- subdirectory1
|   |   |-- module2.py
|   |-- subdirectory2
|   |   |-- file.txt

Скажем также, что я не хочу использовать относительные пути к файлу. Моя интуиция заключается в том, что было бы лучше иметь глобальную переменную, определенную где-то в корне пакета, которая дает абсолютный путь к пакету (например, приведенную выше строку кода) и которая может быть импортирована различными модулями всякий раз, когда им нужно сослаться на файл внутри упаковки. Но куда пойдет эта переменная? В своем собственном модуле? Или для каждого модуля просто лучше получить свой абсолютный путь, получить из него корень пакета, а затем добавить его в местоположение файла?

Изменить: еще одна идея, чтобы сохранить это в os.environ и модули получат его оттуда. Может быть, поставить следующую строку в верхнем уровне __init__.py:

os.environ['MY_PACKAGE_ROOT'] = os.path.dirname(os.path.abspath(__file__))

2 ответа

Чтобы получить путь к пакету:

os.path.dirname(sys.modules['__main__'].__file__

или если пакет импортирован сам:

os.path.dirname(sys.modules['package']).__file__

Я не работал с пакетами пространства имен и самими соответствующими путями.

Иногда, когда люди спрашивают о "путях" в Python, я хотел бы, чтобы они разграничивали путь модуля Python "package.subpackage.module", а не путь к имени файла операционной системы ".\ Package \ subdirectory \ module.py"

Вы также можете просматривать документы Python, когда установлен атрибут _ path _.

Вы должны использовать систему импорта. subdirectory1 а также subdirectory2 должны быть пакеты (вы можете сделать их так, добавив __init__.py файл для них, и затем вы можете использовать обычный механизм импорта Python для ссылки на модули:

import package.module1
import package.subdirectory1.module2
import package.subdirectory2.file

и так далее.

Другие вопросы по тегам