Назначение некоторого стандартного кода в __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 (разрешает символическое связывание) абсолютного пути к исполняемому файлу.

С помощью этого метода проект теперь может выполнять двоичные файлы, которые включены в этот каталог "прародитель", без необходимости ставить префикс двоичного исполняемого файла.

Примечание: без контекста, где вы видите этот код, трудно дать больше ответа относительно того, почему он использовался.

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