0Pricing
Python Academy · Урок

Запуск команд с subprocess

Запускайте внешние программы

«Запуск команд с subprocess» — бесплатный урок Python Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Python Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Python Academy содержит 4 уроков всего.

Что такое подпроцесс

Модуль subprocess позволяет Вашей программе на Python запускать внешние команды и другие программы — так же, как при вводе команд в терминале.

import subprocess

result = subprocess.run(['echo', 'hello'])
print('return code:', result.returncode)

Основы запуска подпроцесса

subprocess.run() — рекомендуемый способ запуска. Передайте команду в виде списка аргументов: сначала имя программы, затем каждый аргумент отдельно.

import subprocess

result = subprocess.run(['echo', 'one', 'two'])
print('done with code', result.returncode)

Почему список, а не строка

Передача списка не позволяет оболочке разбирать Вашу команду, что предотвращает ошибки в кавычках и риски внедрения команд оболочки. Каждый элемент является отдельным аргументом.

import subprocess

# Safe: each piece is its own argument
subprocess.run(['echo', 'a file with spaces.txt'])

Объект CompletedProcess

run() возвращает объект CompletedProcess, содержащий args, returncode и, если вывод был перехвачен, сам вывод. Код 0 означает успех.

import subprocess

cp = subprocess.run(['true'])
print('args:', cp.args)
print('returncode:', cp.returncode)

Проверка кодов возврата

Ненулевой код возврата обычно означает, что команда завершилась с ошибкой. После вызова его можно проверить вручную.

import subprocess

cp = subprocess.run(['ls', '/no/such/path'])
if cp.returncode != 0:
    print('command failed with', cp.returncode)

Возврат ошибки при сбое

Передайте check=True, чтобы при ненулевом коде завершения команда run() автоматически вызвала исключение CalledProcessError.

import subprocess

try:
    subprocess.run(['false'], check=True)
except subprocess.CalledProcessError as e:
    print('failed with code', e.returncode)

Передача аргументов

Дополнительные аргументы команды — это просто новые элементы списка. Здесь мы выводим содержимое каталога в подробном формате.

import subprocess

subprocess.run(['echo', '-n', 'no newline'])
print()
print('above echo had -n flag')

Установка timeout

Используйте timeout, чтобы прервать слишком долго выполняющуюся команду. При этом возникает исключение TimeoutExpired.

import subprocess

try:
    subprocess.run(['sleep', '5'], timeout=0.1)
except subprocess.TimeoutExpired:
    print('command took too long, aborted')

Рабочий каталог

Аргумент cwd запускает команду в определённом каталоге, не изменяя собственный рабочий каталог Вашей программы.

import subprocess

subprocess.run(['pwd'], cwd='/tmp')

Параметр запуска оболочки

При использовании shell=True передаётся одна строка команды, которую интерпретирует оболочка. Это позволяет использовать конвейеры и шаблоны подстановки, но представляет риск при работе с ненадёжным вводом. Предпочитайте форму со списком.

import subprocess

subprocess.run('echo hello && echo world', shell=True)

Почему не стоит использовать os.system

Старый os.system возвращает только код завершения и не предоставляет безопасной передачи аргументов или перехвата вывода. Для нового кода его всегда заменяет subprocess.run.

import subprocess

# Modern, safe approach
cp = subprocess.run(['echo', 'modern way'])
print('exit code:', cp.returncode)

Быстрая проверка

Проверьте, насколько хорошо Вы поняли запуск команд.

Итоги

Вы научились запускать команды с помощью подпроцессов:

  • subprocess.run([...]) безопасно запускает внешнюю программу.
  • Он возвращает объект CompletedProcess с атрибутом returncode.
  • check=True вызывает исключение при сбое; timeout прерывает медленные команды.
  • Предпочитайте форму со списком варианту с shell=True.

Далее: перехват вывода команды.

Часто задаваемые вопросы

Урок «Запуск команд с subprocess» бесплатный?

Да — полный текст урока «Запуск команд с subprocess» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Python Academy, подпишись на CoddyKit PRO. Курс Python Academy содержит 4 уроков всего.

Чему я научусь в уроке «Запуск команд с subprocess»?

Запускайте внешние программы Ты практикуешь Python Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Python Academy?

Предыдущий опыт не требуется. Python Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.

Сколько времени занимает урок «Запуск команд с subprocess»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Python Academy?

Да. Каждый урок Python Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Запуск команд с subprocess
  2. Перехват вывода
  3. Окружение и модуль os
  4. shutil для операций с файлами
← Назад к Python Academy