Что делает флаг -m при запуске скрипта в Python?

Ответ

Флаг -m указывает интерпретатору Python запустить модуль из sys.path как исполняемый скрипт. Это основной способ запускать модули из стандартной библиотеки или установленных пакетов.

Ключевое отличие от python file.py:

  • python my_module.py: Python ищет файл my_module.py в текущей директории или по указанному пути.
  • python -m my_module: Python ищет my_module в директориях, перечисленных в sys.path (включая директории с установленными пакетами), что позволяет запускать модули без указания полного пути к файлу.

Когда модуль запускается с флагом -m, его глобальная переменная __name__ устанавливается в "__main__", что позволяет выполнять код внутри блока if __name__ == '__main__':.

Практические примеры:

  1. Запуск встроенного веб-сервера:

    # Запускает простой HTTP-сервер в текущей директории
    python -m http.server 8000
  2. Создание виртуального окружения:

    # Использует модуль venv для создания окружения с именем .venv
    python -m venv .venv
  3. Запуск установленного пакета:

    # Запускает инструмент для форматирования кода Black
    python -m black .

Ответ 18+ 🔞

Да блядь, слушай, вот эта штука с -m — это ж пиздец как удобно, а многие про неё нихуя не знают, ходят как слепые котята!

Вот смотри, обычно-то ты пишешь python my_script.py, и всё ясно — иди, сука, ищи этот файл прямо тут, под носом. А вот python -m my_module — это уже другой коленкор, блядь. Тут Питон начинает шариться по всем закоулкам, куда ты ему натыкал пакетов, по этому самому sys.path. Как будто кричишь ему: «Эй, пидор, найди мне модуль my_module где угодно, хоть в дебрях site-packages

И самое главное — когда модуль так запускаешь, у него внутри __name__ становится "__main__". Ну, ты знаешь, эта магия с if __name__ == '__main__': — чтобы код исполнялся, только когда файл запускают напрямую, а не когда его импортят как библиотеку. Так вот с -m эта хуйня тоже работает, всё честно.

Ну и примеры, чтобы вообще мозг не взорвался от абстракции:

  1. Веб-сервер на коленке за две секунды. Сидишь ты в папке, а тебе срочно надо файлы по сети перекинуть. Нехуя качать nginx! Пишешь:

    python -m http.server 8000

    И всё, блядь! Сервер готов, сидит на порту 8000 и раздаёт твои файлы. Ёперный театр, проще некуда!

  2. Виртуальное окружение. Ну это классика, все должны знать, но на всякий случай:

    python -m venv .venv

    Бум — и у тебя изолированная песочница готова, чтобы не засрать глобальный интерпретатор.

  3. Запуск всяких установленных утилит. Вот поставил ты, допустим, black для форматирования кода. Можно, конечно, искать, куда эта тварь установилась, а можно просто:

    python -m black .

    И он, сука, сам найдётся и отформатирует всё в текущей папке. Красота, блядь!

Короче, -m — это как волшебная палочка, чтобы не ебаться с путями и запускать модули откуда угодно. Запомни это, а то будешь выглядеть как полный ламер!