Какова цель -m-переключателя?

Не могли бы вы объяснить мне, в чем разница между вызовом

python -m mymod1 mymod2.py args

и

python mymod1.py mymod2.py args

Кажется, что в обоих случаях вызывается mymod1.py и sys.argv есть

['mymod1.py', 'mymod2.py', 'args']

Итак, что такое -m для?

Ответ 1

В первой строке раздела Rationale PEP 338 говорится:

Python 2.4 добавляет переключатель командной строки -m, чтобы разрешить размещение модулей с использованием пространства имён модулей Python для выполнения в виде скриптов. Мотивационными примерами были стандартные библиотечные модули, такие как pdb и profile, а реализация Python 2.4 подходит для этой ограниченной цели.

Таким образом, вы можете указать любой модуль в пути поиска Python таким образом, а не только файлы в текущем каталоге. Вы правы, что python mymod1.py mymod2.py args имеет точно такой же эффект. В первой строке раздела Scope of this proposal указано:

В Python 2.4 модуль, расположенный с использованием -m, выполняется так же, как если бы его имя файла было предоставлено в командной строке.

С -m возможно больше, например, работа с модулями, которые являются частью пакета, и т.д. Что касается остальной части PEP 338. Прочтите его для получения дополнительной информации.

Ответ 2

Еще одна вещь, которую я думаю стоит отметить, когда выполнить

python -m some_module some_arguments

Интерпретатор python будет искать " основной.py" файл в пути модуля для выполнения. Это эквивалентно:

python path_to_module/__main__.py somearguments

Он выполнит содержимое после:

if __name__ == "__main__":

Если файл не существует, этот модуль не может быть выполнен напрямую.