Выполнение Python скриптов в операционной системе Windows

Раздел: Администрирование -> Управление скриптами

Организация выполнения кода Python на Windows

Для администратора важно иметь повторяемый запуск скриптов в Windows. Основной способ строится на использовании py-запускателя и изолированного виртуального окружения. Такой подход исключает зависимость от версии Python в системном PATH и позволяет зафиксировать набор библиотек.

Как запустить Python сценарий с предсказуемым окружением?

Сначала в каталоге проекта создается виртуальное окружение:

py -m venv C:\scripts\.venv

Python скрипты windows (запуск скриптов python в windows)

Затем для запуска используется полный путь к интерпретатору внутри окружения:

C:\scripts\.venv\Scripts\python.exe C:\scripts\hello.py

Execute 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 -0
Installed 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 freeze
beautifulsoup4==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 LIST
Folder: 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 ReportWorker
SERVICE_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% может содержать устаревшее значение из-за расширения переменных. Пример выше не полагается на переменную внутри блока.

Запуск скриптов Python в Windows - comments

En
Python скрипты windows (python)