Выполнение Python скриптов в операционной системе Windows
Организация выполнения кода Python на Windows
Для администратора важно иметь повторяемый запуск скриптов в Windows. Основной способ строится на использовании py-запускателя и изолированного виртуального окружения. Такой подход исключает зависимость от версии Python в системном PATH и позволяет зафиксировать набор библиотек.
Как запустить Python сценарий с предсказуемым окружением?
Сначала в каталоге проекта создается виртуальное окружение:
py -m venv C:\scripts\.venvPython скрипты windows (запуск скриптов python в windows)
Затем для запуска используется полный путь к интерпретатору внутри окружения:
C:\scripts\.venv\Scripts\python.exe C:\scripts\hello.pyExecute script python (выполнение скрипта python)
Для регулярного использования создается файл run_hello.bat:
@echo off
set PYTHONUTF8=1
"C:\scripts\.venv\Scripts\python.exe" "C:\scripts\hello.py"
pauseПеременная PYTHONUTF8 включает режим UTF-8 для stdin, stdout и файлов, что уменьшает число ошибок кодировки в консоли Windows. Команда pause задерживает закрытие окна после завершения скрипта.
Наиболее частая ошибка при выполнении команды python возникает, когда интерпретатор не добавлен в PATH. В этом случае Windows возвращает сообщение вида python is not recognized as an internal or external command. Использование py решает эту проблему, поскольку py-запускатель регистрируется в системе отдельно.
Если py также не найден, следует переустановить Python и убедиться, что в компонентах установки отмечен пункт py launcher. После переустановки терминал открывается заново.
Как выполнить скрипт в командной строке одной строкой?
Прямой вызов интерпретатора с именем файла подходит для разовой проверки:
python C:\scripts\hello.py argument1 argument2Эквивалентный вариант через py-запускатель позволяет выбрать версию:
py -3.12 C:\scripts\hello.pyДля старых сценариев может потребоваться версия 3.8, тогда после команды py -0 виден список доступных интерпретаторов.
Если имя пути содержит пробелы, команда оборачивается в кавычки: py "C:\Program Files\MyApp\run.py". Без кавычек интерпретатор получит часть пути как отдельный аргумент.
Как запустить модуль Python с помощью -m?
Для модулей, у которых присутствует блок if __name__ == "__main__", применяется флаг -m:
python -m http.server 8000Этот способ запускает модуль как основную программу, добавляя текущий каталог в начало sys.path. Для собственного пакета команда выглядит так:
python -m my_package.tool --verboseПри запуске обычного файла через -m с именем script.py возникает ошибка, потому что -m ожидает имя модуля, а не путь к файлу. Для файлов используется команда python script.py.
Как открыть консоль и увидеть код возврата?
PowerShell позволяет контролировать результат выполнения через $LASTEXITCODE:
python C:\scripts\backup.py
Write-Host "Exit code: $LASTEXITCODE"Тот же процесс в cmd:
python C:\scripts\backup.py
echo %ERRORLEVEL%В обоих случаях после команды видна переменная с кодом завершения. Ненулевое значение говорит об ошибке в скрипте.
Иногда PowerShell не дает запустить .ps1 файлы из-за политики выполнения. Для одного вызова разрешается обход политики без изменения системных настроек:
powershell -ExecutionPolicy Bypass -File C:\scripts\run_backup.ps1Это не относится к .py файлам, а затрагивает только сценарии PowerShell, которые вызывают Python.
Как запустить сценарий без окна консоли?
Для GUI-приложений предназначен интерпретатор pythonw.exe. Файл с расширением .pyw открывается им автоматически:
pyw C:\scripts\desktop_app.pywВ bat-файле используется полный путь:
C:\scripts\.venv\Scripts\pythonw.exe C:\scripts\desktop_app.pywПри запуске консольного скрипта через pythonw.exe вывод не отображается, поэтому ошибки остаются незамеченными. Для консольных задач применяется python.exe, а pythonw.exe только для оконных интерфейсов.
Как автоматизировать запуск по расписанию?
Планировщик заданий Windows принимает команду schtasks:
schtasks /Create /TN "Daily Python Backup" /TR "C:\Python\python.exe C:\Scripts\backup.py" /SC DAILY /ST 09:00В графическом интерфейсе Планировщика заданий в полях Program/script и Arguments указываются путь к интерпретатору и путь к скрипту. Поле Start in задает рабочую директорию, в которой выполняются относительные пути.
Если задание запускается, но скрипт не находит свои файлы, причина обычно в неправильном рабочем каталоге. В графическом интерфейсе заполняется поле Start in, а в командной строке используется параметр /TR с полными путями.
Как оформить скрипт как службу Windows?
Для длительных процессов применяется NSSM. Служба создается командой:
nssm install MyPythonService "C:\Python\python.exe" "C:\Scripts\worker.py"
nssm start MyPythonServiceПараметры запуска, рабочий каталог и переменные окружения настраиваются через nssm set. Этот вариант подходит для агентов и обработчиков очередей, которые должны работать при незарегистрированной сессии пользователя.
Служебный запуск происходит без обычного рабочего стола, поэтому пути к ресурсам должны быть абсолютными. Логи лучше направлять в файл, а не в консоль.
Раздел содержит расширенные примеры выполнения кода Python в Windows, включая работу с несколькими версиями, виртуальным окружением, планировщиком и службой NSSM.
Список установленных версий Python
Команда py -0 выводит таблицу доступных интерпретаторов:
py -0Installed Pythons found by py Launcher for Windows -3.12-64 C:\Python\312\python.exe -3.11-64 C:\Python\311\python.exe -3.9-64 C:\Python\39\python.exe
Флаг -0p добавляет полные пути:
py -0p-3.12-64 C:\Python\312\python.exe * -3.11-64 C:\Python\311\python.exe -3.9-64 C:\Python\39\python.exe
Звездочка показывает версию по умолчанию. Запуск конкретной версии выполняется так:
py -3.9 C:\scripts\legacy.pyТакой способ обеспечивает обратную совместимость, когда устаревший код не работает с новой версией.
Создание виртуального окружения и установка зависимостей
cd C:\scripts\myproject
py -3.12 -m venv .venv
.venv\Scripts\python.exe -m pip install --upgrade pip
.venv\Scripts\python.exe -m pip install -r requirements.txtПосле установки зависимостей список пакетов выводится командой:
.venv\Scripts\python.exe -m pip freezebeautifulsoup4==4.12.3 requests==2.31.0
Запуск основного модуля проекта:
.venv\Scripts\python.exe -m app.main --config config.yamlВиртуальное окружение изолирует библиотеки и не изменяет глобальный интерпретатор Windows.
Проверка кода завершения в пакетном файле
Пакетный файл может останавливаться при ошибке или продолжать работу. Пример с проверкой уровня ошибки:
@echo off
set PYTHONUTF8=1
set PYTHONPATH=C:\scripts\myproject
"C:\scripts\.venv\Scripts\python.exe" "C:\scripts\myproject\worker.py" --mode daily
if errorlevel 1 (
echo Worker stopped with error code %ERRORLEVEL%
exit /b %ERRORLEVEL%
)
echo Worker finished successfully
В PowerShell аналогичная проверка выглядит так:
$env:PYTHONUTF8 = "1"
$env:PYTHONPATH = "C:\scripts\myproject"
$p = Start-Process -FilePath "C:\scripts\.venv\Scripts\python.exe" -ArgumentList "C:\scripts\myproject\worker.py", "--mode", "daily" -Wait -PassThru
if ($p.ExitCode -ne 0) { Write-Error "Exit code $($p.ExitCode)" }Использование Start-Process позволяет получить объект процесса и его код завершения.
Запуск модуля http.server на выбранном порту
Встроенный модуль http.server часто используется для быстрой раздачи файлов по локальной сети:
python -m http.server 8080 --bind 127.0.0.1 --directory C:\SharedВывод при успешном запуске:
Serving HTTP on 127.0.0.1 port 8080 (http://127.0.0.1:8080/) ...
Для завершения работы используется Ctrl+C.
Запуск с оптимизацией и без байткода
Интерпретатор Python поддерживает флаги, изменяющие режим выполнения. Флаг -O убирает assert-проверки:
python -O C:\scripts\app.pyФлаг -B отключает запись .pyc файлов:
python -B C:\scripts\app.pyФлаг -u включает небуферизованный вывод:
python -u C:\scripts\logger.pyКомбинация флагов допустима:
python -O -B -u C:\scripts\app.pyТакие режимы полезны для временного запуска, когда не требуется создание кэша или когда важна своевременная запись логов.
Переменные окружения и рабочий каталог
Для Windows переменные окружения задаются в командной строке через set:
set PYTHONUTF8=1
set PYTHONDONTWRITEBYTECODE=1
python C:\scripts\app.pyВ PowerShell синтаксис отличается:
$env:PYTHONUTF8 = "1"
$env:PYTHONDONTWRITEBYTECODE = "1"
python C:\scripts\app.pyРабочий каталог влияет на поиск файлов. Запуск с явной сменой каталога в cmd:
cd /d C:\scripts\project
python app.pyВ PowerShell:
Set-Location C:\scripts\project
python app.pyОтносительные пути в скрипте считаются от текущего каталога процесса, а не от местоположения файла скрипта. Для получения каталога самого скрипта внутри Python используется Path(__file__).resolve().parent.
Запуск планировщика заданий через schtasks
Создание ежедневного задания с указанием рабочих параметров:
schtasks /Create /F /TN "Admin\Python Report" /TR \"C:\Python\312\python.exe\" \"C:\Scripts\report.py\" /SC DAILY /ST 09:30 /RU SYSTEMПосле создания задание можно проверить:
schtasks /Query /TN "Admin\Python Report" /V /FO LISTFolder: Admin TaskName: Admin\Python Report Status: Ready Schedule Type: Daily Start Time: 09:30 ...
Запуск задания вручную:
schtasks /Run /TN "Admin\Python Report"Удаление задания:
schtasks /Delete /TN "Admin\Python Report" /FПараметр /RU SYSTEM указывает учетную запись SYSTEM, которая не требует пароля, но имеет ограниченный доступ к сетевым ресурсам.
Запуск Python скрипта как службы через NSSM
NSSM позволяет превратить команду Python в службу Windows. Установка службы:
nssm install ReportWorker
nssm set ReportWorker Application C:\Python\312\python.exe
nssm set ReportWorker AppParameters C:\Scripts\worker.py --queue reports
nssm set ReportWorker AppDirectory C:\Scripts
nssm set ReportWorker AppStdout C:\Logs\worker.log
nssm set ReportWorker AppStderr C:\Logs\worker_err.log
nssm start ReportWorkerПроверка статуса:
nssm status ReportWorkerSERVICE_RUNNING
Если служба не нужна, она останавливается и удаляется:
nssm stop ReportWorker
nssm remove ReportWorker confirmДля службы используется конфигурация реестра, создаваемая NSSM. Логи пишутся в файлы, указанные в AppStdout и AppStderr. Это решение подходит для длительных процессов, которые должны запускаться при старте Windows.
Использование pythonw.exe для графической программы
C:\Scripts\.venv\Scripts\pythonw.exe C:\Scripts\tray_app.pywФайл .pyw не открывает консольное окно. Для проверки работоспособности такой программы добавляется файл-журнал:
# tray_app.pyw
from pathlib import Path
import sys
log = Path.home() / "tray_app.log"
with open(log, "a", encoding="utf-8") as f:
f.write("started with args: " + repr(sys.argv) + "\n")
После запуска в домашнем каталоге появляется запись. Подобный подход позволяет отлаживать GUI-скрипты, когда консоль недоступна.
Запуск с выбором интерпретатора через .bat
Пакетный файл может автоматически выбирать установленную версию Python. Для универсального окружения создается bat-файл:
@echo off
set PYTHONUTF8=1
where py >nul 2>nul
if %errorlevel%==0 (
py -3.12 "C:\Scripts\main.py" %*
) else (
python "C:\Scripts\main.py" %*
)
Передача аргументов через %* сохраняет все параметры, переданные в bat-файл. Такой файл удобен для старых систем, где py может отсутствовать.
В bat-файлах важно отличать %errorlevel% внутри скобок от значения вне скобок. Внутри блока if используется errorlevel как оператор, а переменная %ERRORLEVEL% может содержать устаревшее значение из-за расширения переменных. Пример выше не полагается на переменную внутри блока.