Введение

Запуск подпроцесса Python. Python — универсальный и мощный язык программирования, широко используемый для различных приложений. Одним из основных модулей в Python является модуль подпроцесса, который позволяет создавать новые процессы, подключаться к их каналам ввода/вывода/ошибки и получать их коды возврата. В этой статье мы углубимся в функцию subprocess.run(), изучая ее функции, варианты использования и лучшие практики.

Что такое функция subprocess.run()?

Функция subprocess.run() является частью модуля subprocess, представленного в Python 3.5. Он предоставляет простой и эффективный способ создания новых процессов, выполнения системных команд и взаимодействия с ними. Эта функция предназначена для замены старых функций, таких как subprocess.call() и subprocess.check_output(), предлагая более универсальный и удобный интерфейс.

Как использовать subprocess.run()?

Использовать subprocess.run() просто. Основной синтаксис следующий:

питон

result = subprocess.run(args, capture_output=False, text=False, timeout=None, input=None, check=False, shell=False)

Вот краткое объяснение параметров:

  • args: список аргументов командной строки или строка, представляющая команду для выполнения.
  • capture_output: если установлено значение True, фиксируются стандартный вывод и ошибка команды.
  • text: если установлено значение True, стандартный вывод и ошибка возвращаются в виде строк, а не байтов.
  • timeout: максимальное время ожидания завершения команды.
  • input: Обеспечивает ввод команды.
  • check: если установлено значение True, вызывает CalledProcessError, если команда возвращает ненулевой статус выхода.
  • shell: если установлено значение True, команда выполняется с использованием оболочки.

Запуск простых команд оболочки

Давайте начнем с запуска простой команды оболочки, используя subprocess.run(). Например, давайте выполним команду ls, чтобы получить список файлов в текущем каталоге:

питон

import subprocess
result = subprocess.run(['ls'])
print(result.returncode)

Захват вывода и ошибки

Во многих случаях может потребоваться зафиксировать выходные данные и ошибки, сгенерированные командой. Этого можно добиться, установив для параметра capture_output значение True.

питон

result = subprocess.run(['ls'], capture_output=True, text=True)
print(result.stdout)
print(result.stderr)

Обработка кодов возврата

Код возврата указывает, была ли команда выполнена успешно или нет. По умолчанию subprocess.run() не вызывает никаких исключений для ненулевого кода возврата. Однако вы можете изменить это поведение, установив для параметра check значение True.

питон

try:
    result = subprocess.run(['invalid_command'], check=True)
except subprocess.CalledProcessError as e:
    print(f"Error: {e}")

Тайм-аут и обработка ввода

Вы можете установить максимальное время выполнения команды с помощью параметра timeout. Кроме того, вы можете предоставить входные данные для команды через параметр input.

питон

result = subprocess.run(['python3', 'script.py'], timeout=5, input=b'input_data', capture_output=True, text=True)
print(result.stdout)

Интерактивные процессы с subprocess.run()

subprocess.run() не подходит для обработки интерактивных процессов. Для таких случаев лучше использовать subprocess.Popen.

Соображения безопасности

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

Примеры использования subprocess.run()

subprocess.run() полезен в различных сценариях, таких как вызов внешних инструментов, управление системными задачами и автоматизация процессов.

Лучшие практики

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

Распространенные ошибки, которых следует избегать

  • Пренебрежение проверкой кода возврата при необходимости.
  • Использование shell=True без надлежащей проверки ввода подвергает ваше приложение риску безопасности.

Альтернативы subprocess.run()

В зависимости от вашего варианта использования вы можете найти другие функции в модуле subprocess более подходящими, например, subprocess.Popen или subprocess.call().

Оптимизация производительности

Если вам нужно часто выполнять команды, рассмотрите возможность повторного использования одного и того же экземпляра subprocess.Popen, чтобы уменьшить накладные расходы.

Советы по устранению неполадок

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

Заключение

В заключение, функция subprocess.run() — ценный инструмент в Python для выполнения системных команд и управления процессами. Его удобный интерфейс и мощные функции делают его неотъемлемой частью любого инструментария разработчика.

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

  1. В: Можно ли использоватьsubprocess.run()для запуска сложных команд с несколькими аргументами?
    О: Абсолютно! Вы можете передать несколько аргументов в списке при вызове subprocess.run().
  2. В: Является лиsubprocess.run()межплатформенной совместимостью?
    О: Да, subprocess.run() работает на различных платформах, включая Windows, macOS и Linux.
  3. Вопрос. Можно ли перенаправить вывод в файл с помощьюsubprocess.run()?
    О. Да, можно перенаправить вывод в файл, указав путь к файлу в качестве stdout или stderr аргумент.
  4. Вопрос. Что делать, если выполнение моей команды занимает много времени?
    Ответ. Рассмотрите возможность установки разумного времени ожидания с помощью параметра timeout, чтобы предотвратить длительное выполнение.
  5. Вопрос: Существует ли ограничение на длину команды, которую я могу выполнить с помощьюsubprocess.run()?
    О: Длина команды обычно ограничена максимальной командой операционной системы -длина строки, но это редко проблема.

Связанный

Python Popen: понимание управления подпроцессами в Python

Лучшие методы проверки установленных модулей Python — Techclaw

Круговые зависимости в Python — Techclaw