Как узнать, был ли запущен python script с использованием опции-интерпретатора -m?
Я не смог найти ответ, прочитав все следующее:
Обоснование:
Когда тест script, который использует относительный импорт, выполняется без опции -m
, я мог бы напечатать предупреждающее сообщение вместо того, чтобы оставлять пользователя со стандартной трассировкой, приводящей к исключению ValueError: Attempted relative import in non-package
. Не зная этого, я могу поймать это исключение, и причиной ошибки может быть только предложить отсутствие опции -m
.
Ответы
Ответ 1
Другое наблюдение заключается в том, что __package__
устанавливается None
при непосредственном выполнении script и имени пакета при использовании -m
(используя пустую строку, когда модуль не включен в какой-либо пакет, поэтому он все еще отличается от None
).
Ответ 2
Отказ от ответственности: это просто наблюдение, я не видел его в документах, поэтому он, вероятно, зависит от реализации и может не быть согласованным в разных версиях Python.
Я заметил, что при вызове script с использованием опции -m
в пространство имен добавляется переменная с именем __loader__
, поэтому в верхней части вашего script вы можете проверить наличие этой переменной:
if '__loader__' in globals():
# called with -m
Для дополнительной безопасности вы можете проверить, является ли __loader__
экземпляром pkgutil.ImpLoader
:
if '__loader__' in globals() and __loader__.__class__.__name__ == 'ImpLoader':