Как узнать, был ли запущен скрипт python с использованием опции -m интерпретатора?

Я не смог найти ответ, прочитав все следующее:

  • PEP 338 Выполнение модулей как скриптов
  • документация стандартного модуля runpy
  • описание опции -m интерпретатора Python

Обоснование:
Когда тестовый скрипт, который использует относительный импорт, запускается без опции -m я могу напечатать предупреждающее сообщение, а не оставлять пользователя со стандартной трассировкой, ведущей к ValueError: Attempted relative import in non-package исключении, ValueError: Attempted relative import in non-package . Не зная этого, я могу поймать это исключение и только предположить отсутствие опции -m может быть причиной ошибки.

Другое наблюдение заключается в том, что при запуске скрипта непосредственно и имени пакета при использовании -m при запуске скрипта __package__ установлено значение None (с использованием пустой строки, когда модуль не включен в какой-либо пакет, поэтому он по-прежнему отличается от None ).

Отказ от ответственности: это просто наблюдение, я не видел его в документах, поэтому он, вероятно, зависит от реализации и может быть несовместимым в разных версиях Python.

Я заметил, что при вызове сценария с использованием опции -m в пространство имен добавляется переменная с именем __loader__ , поэтому в верхней части вашего скрипта вы можете проверить наличие этой переменной:

 if '__loader__' in globals(): # called with -m 

Для некоторой дополнительной безопасности вы можете проверить, является ли __loader__ экземпляром pkgutil.ImpLoader :

 if '__loader__' in globals() and __loader__.__class__.__name__ == 'ImpLoader':