Исполнение Python кода: от терминала до автоматизации

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

Основные и альтернативные способы запуска файлов Python

Как выполнить Python скрипт из командной строки?

Самый распространённый и универсальный метод - использование терминала. Для этого требуется установленная версия Python (проверяется командой python3 --version или python --version).

python3 script.py

Run files python (запуск файлов python)

Если в системе несколько версий, уточняется имя исполняемого файла (python3, python, py). Переход в каталог с файлом осуществляется командой cd.

Возможные ошибки:

  • Файл не найден - проверяется путь или расширение (.py).
  • Синтаксическая ошибка - анализируется сообщение интерпретатора, исправляется код.
  • Отсутствие прав на выполнение (Unix) - устанавливается разрешение chmod +x script.py после добавления shebang.

Как передать аргументы при запуске?

Встроенный модуль sys позволяет принимать параметры командной строки. Пример скрипта args_demo.py:

import sys
print('Аргументы:', sys.argv)

Выполнение с аргументами:

$ python3 args_demo.py arg1 42 --flag
Аргументы: ['args_demo.py', 'arg1', '42', '--flag']

Первый элемент - имя файла, остальные - переданные значения. Индекс sys.argv[0] всегда содержит путь к скрипту.

Частая ошибка - обращение к несуществующему индексу (например, sys.argv[2] при отсутствии третьего аргумента). Следует проверять длину списка len(sys.argv) или использовать модуль argparse (рассмотрен в расширенных примерах).

Как запустить один скрипт из другого?

Модуль subprocess предоставляет возможность выполнить внешний процесс. Пример запуска other.py:

import subprocess
result = subprocess.run(['python3', 'other.py'], capture_output=True, text=True)
print(result.stdout)

Аргумент capture_output перехватывает вывод, text=True возвращает строку вместо байтов. result.returncode содержит код завершения (0 - успех).

Проблемы: если файл не найден, возникает FileNotFoundError. Если скрипт ожидает ввод, требуется передача данных через stdin. Альтернатива - subprocess.check_output для простого захвата вывода.

Как выполнить модуль как скрипт?

Ключ -m позволяет интерпретатору запустить модуль из стандартной библиотеки или установленного пакета. Например, для запуска встроенного HTTP-сервера:

python3 -m http.server 8000

Для собственного модуля, лежащего в пакете mypackage.my_module:

python3 -m mypackage.my_module

Файл должен содержать блок if __name__ == '__main__'. Это гарантирует корректное выполнение как скрипта и предотвращает запуск при импорте.

Ошибка ModuleNotFoundError возникает, если модуль не находится в sys.path. Проверяется установка пакета (pip list) или добавление пути через PYTHONPATH.

Как сделать скрипт исполняемым в Unix?

Добавление shebang в первую строку файла:

#!/usr/bin/env python3

Затем устанавливается право на выполнение:

chmod +x script.py

Теперь скрипт запускается как ./script.py. Строка shebang указывает, какой интерпретатор использовать. Форма /usr/bin/env более гибкая, чем прямой путь.

Если файл не запускается, проверяется правильность пути к интерпретатору (команда which python3). В Windows this способ не работает - используются ассоциации файлов или скрипты-обёртки (.bat, .ps1).

Как выполнить код из другого файла динамически?

Встроенная функция exec позволяет выполнить произвольный код Python:

with open('another_script.py') as f:
    code = f.read()
exec(code)

Или через exec(open(...).read()). При этом переменные и функции будут доступны в текущем пространстве имён.

Риски: выполнение непроверенного кода может привести к уязвимостям. Рекомендуется использовать importlib или runpy (см. расширенные примеры) для более контролируемого запуска.

Как запустить скрипт в среде разработки (IDE)?

В VS Code нажатие клавиши F5 или Ctrl+F5 запускает текущий файл. В PyCharm - зелёная стрелка рядом с функцией main. Предварительно настраивается интерпретатор (Python interpreter). Конфигурация запуска позволяет передавать аргументы, устанавливать переменные окружения, указывать рабочую директорию.

Проблемы: неправильно указан интерпретатор, отсутствие установленных библиотек (устанавливаются через pip или встроенный менеджер пакетов IDE).

Расширенные примеры запуска Python файлов

Ниже приведены более сложные сценарии, которые редко встречаются в базовых руководствах.

Пример 1: Обработка аргументов с argparse

Модуль argparse предоставляет удобный интерфейс для разбора параметров командной строки с автоматической генерацией справки.

Пример
#!/usr/bin/env python3
# file: greet.py
import argparse

parser = argparse.ArgumentParser(description='Приветствие пользователя')
parser.add_argument('--name', required=True, help='Имя')
parser.add_argument('--count', type=int, default=1, help='Количество повторений')
args = parser.parse_args()

for _ in range(args.count):
    print(f'Привет, {args.name}!')
$ python3 greet.py --name=Мир --count=3
Привет, Мир!
Привет, Мир!
Привет, Мир!

$ python3 greet.py --help
usage: greet.py [-h] --name NAME [--count COUNT]

Приветствие пользователя

Объяснение: argparse автоматически преобразует типы (int), проверяет обязательность аргументов (required=True) и выводит справку при ошибке. Это избавляет от ручного разбора sys.argv.

Пример 2: Запуск скрипта в фоновом режиме с перенаправлением вывода

Использование subprocess.Popen для асинхронного запуска и захвата логов в реальном времени.

Пример
import subprocess
import time

process = subprocess.Popen(
    ['python3', 'long_task.py'],
    stdout=subprocess.PIPE,
    stderr=subprocess.PIPE,
    text=True
)

# Чтение вывода по мере появления
while True:
    output = process.stdout.readline()
    if output == '' and process.poll() is not None:
        break
    if output:
        print(f'[stdout] {output.strip()}')

return_code = process.poll()
print(f'Процесс завершён с кодом {return_code}')

Результат: строчки вывода long_task.py отображаются без ожидания завершения всего скрипта. Ошибки записываются в stderr и могут быть отдельно обработаны.

Типичная ошибка - зависание при чтении, если процесс генерирует много вывода и буфер заполняется. Решение: использовать PIPE с неблокирующим чтением или потоки.

Пример 3: Запуск файла как модуля с помощью runpy

Функция run_path из модуля runpy позволяет выполнить файл, не импортируя его, и получить результат в виде словаря глобальных переменных.

Пример
from runpy import run_path

# Файл demo.py содержит: result = 42
globals_after = run_path('demo.py', init_globals={'x': 10})
print(globals_after['result'])   # 42
print(globals_after['x'])        # 10 (инициализированное значение)

Объяснение: run_path удобен для запуска конфигурационных скриптов или плагинов, так как изолирует глобальные переменные от основного пространства имён.

Пример 4: Запуск с профилированием (cProfile)

Для анализа производительности скрипта используется встроенный профилировщик:

Пример
python3 -m cProfile -s time myscript.py

Это выводит таблицу вызовов функций, отсортированную по затраченному времени. Для сохранения результатов в файл:

Пример
python3 -m cProfile -o output.prof myscript.py

Впоследствии файл анализируется через pstats или графические утилиты (snakeviz).

Если скрипт короткий, профилировщик может исказить время (накладные расходы). Рекомендуется запускать на достаточно длительном коде.

Пример 5: Запуск нескольких скриптов параллельно с concurrent.futures

Пример
import subprocess
from concurrent.futures import ThreadPoolExecutor

def run_script(name):
    result = subprocess.run(['python3', name], capture_output=True, text=True)
    return name, result.returncode, result.stdout

scripts = ['task1.py', 'task2.py', 'task3.py']
with ThreadPoolExecutor(max_workers=3) as executor:
    futures = {executor.submit(run_script, s): s for s in scripts}
    for future in concurrent.futures.as_completed(futures):
        name, code, out = future.result()
        print(f'{name}: returncode={code}, output={out[:50]}')

Этот подход полезен для автоматизации запуска независимых задач, например, обработки файлов или тестов.

Пример 6: Использование консольных точек входа (entry points)

При создании пакета Python можно определить исполняемую команду в setup.py или pyproject.toml:

Пример
# setup.py
from setuptools import setup

setup(
    name='myapp',
    version='1.0',
    py_modules=['myapp'],
    entry_points={
        'console_scripts': [
            'myapp = myapp:main'
        ]
    }
)

После установки пакета (pip install .) команда myapp становится доступна в терминале и запускает функцию main() из модуля myapp.py.

Результат: упрощение запуска для конечных пользователей, не требуется указывать путь или вызывать интерпретатор явно.

Запуск файлов Python - comments

En
Run files python (python)