Запуск команд с 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 — локальная установка не требуется.
Все уроки этого курса
- Запуск команд с subprocess
- Перехват вывода
- Окружение и модуль os
- shutil для операций с файлами