Назначение некоторого стандартного кода в __main__.py
Я видел следующий код в нескольких проектах Python, в __main__.py
, Может ли кто-нибудь объяснить цель? Конечно, он помещает каталог, содержащий __main__.py
во главе sys.path
, но почему? А зачем тесты (__package__ is None and not hasattr(sys, 'frozen')
? Кроме того, в sys.path.insert
, почему os.path.dirname
звонил дважды?
import sys
if __package__ is None and not hasattr(sys, 'frozen'):
# direct call of __main__.py
import os.path
path = os.path.realpath(os.path.abspath(__file__))
sys.path.insert(0, os.path.dirname(os.path.dirname(path)))
2 ответа
Тест для __package__
позволяет запускать код, когда package/__main__.py
был запущен с такой командой python __main__.py
или же python package/
(называя файл напрямую или называя путь к папке пакета), не самый обычный способ запуска основного модуля пакета python -m package
, Другой чек (для sys.frozen
) проверяет, был ли пакет упакован с чем-то вроде py2exe
в один файл, а не в обычной файловой системе.
Что делает код, так это помещает родительскую папку пакета в sys.path
, То есть если __main__.py
находится по адресу /some/path/to/package/__main__.py
код поставит /some/path/to
в sys.path
, Каждый звонок dirname
снимает один предмет с правой стороны дорожки ("/some/path/to/package/__main__.py"
=> "/some/path/to/package"
=> "/some/path/to"
).
os.path.dirname(os.path.dirname(path))
- Получает каталог прародителя (каталог, содержащий каталог данного path
переменная); это добавляется к системе PATH
переменная.
os.path.realpath(os.path.abspath(__file__))
- Получает realpath
(разрешает символическое связывание) абсолютного пути к исполняемому файлу.
С помощью этого метода проект теперь может выполнять двоичные файлы, которые включены в этот каталог "прародитель", без необходимости ставить префикс двоичного исполняемого файла.
Примечание: без контекста, где вы видите этот код, трудно дать больше ответа относительно того, почему он использовался.