Предпочтительный способ разрешения корня пакета в 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
и так далее.