Ответ
Флаг -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__':.
Практические примеры:
-
Запуск встроенного веб-сервера:
# Запускает простой HTTP-сервер в текущей директории python -m http.server 8000 -
Создание виртуального окружения:
# Использует модуль venv для создания окружения с именем .venv python -m venv .venv -
Запуск установленного пакета:
# Запускает инструмент для форматирования кода 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 эта хуйня тоже работает, всё честно.
Ну и примеры, чтобы вообще мозг не взорвался от абстракции:
-
Веб-сервер на коленке за две секунды. Сидишь ты в папке, а тебе срочно надо файлы по сети перекинуть. Нехуя качать nginx! Пишешь:
python -m http.server 8000И всё, блядь! Сервер готов, сидит на порту 8000 и раздаёт твои файлы. Ёперный театр, проще некуда!
-
Виртуальное окружение. Ну это классика, все должны знать, но на всякий случай:
python -m venv .venvБум — и у тебя изолированная песочница готова, чтобы не засрать глобальный интерпретатор.
-
Запуск всяких установленных утилит. Вот поставил ты, допустим,
blackдля форматирования кода. Можно, конечно, искать, куда эта тварь установилась, а можно просто:python -m black .И он, сука, сам найдётся и отформатирует всё в текущей папке. Красота, блядь!
Короче, -m — это как волшебная палочка, чтобы не ебаться с путями и запускать модули откуда угодно. Запомни это, а то будешь выглядеть как полный ламер!