Въведение

Python Subprocess Run — 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, изпълнява командата с помощта на обвивката.

Изпълнение на прости команди на shell

Нека започнем, като изпълним проста команда на shell, използвайки 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