Как узнать, был ли запущен скрипт python с использованием опции -m интерпретатора?
Я не смог найти ответ, прочитав все следующее:
- PEP 338 Выполнение модулей как скриптов
- документация стандартного модуля
runpy
- описание опции
-m
интерпретатора Python
Обоснование:
Когда тестовый скрипт, который использует относительный импорт, запускается без опции -m
я могу напечатать предупреждающее сообщение, а не оставлять пользователя со стандартной трассировкой, ведущей к ValueError: Attempted relative import in non-package
исключении, ValueError: Attempted relative import in non-package
. Не зная этого, я могу поймать это исключение и только предположить отсутствие опции -m
может быть причиной ошибки.
- Как я могу указать, что некоторые аргументы командной строки являются обязательными в Python?
- Выполните несколько команд командной строки из c ++
- Выполнение программ командной строки из python
- Как скопировать текст в / из буфера обмена в Go?
- проверка JSON из командной строки с использованием `python -m jsontool` дает« Нет объекта JSON, который может быть декодирован »
Другое наблюдение заключается в том, что при запуске скрипта непосредственно и имени пакета при использовании -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':
- Многопроцессорность Python.Код взаимоблокировки на put и get
- Как передать большие массивы между numpy и R?
- Как запустить ipython из оболочки, запустив «python …»?
- Python, используя os.system – Есть ли способ, чтобы скрипт Python прошел мимо этого, не дожидаясь завершения вызова?
- Полная командная строка, когда она была напечатана
- Отсутствует аргумент argpse в python 3
- Ошибка при установке Python
- Запуск сценария R из командной строки (для выполнения с python)
- Длинные программы, использующие переключатель python -c
- Как скомпилировать проект Visual Studio из командной строки?
- Как не процитировать аргумент в подпроцессе?