Python

Як виконувати команди оболонки в Python, використовуючи метод запуску підпроцесу

Як виконувати команди оболонки в Python, використовуючи метод запуску підпроцесу
Підпроцес - це вбудований модуль Python, який можна використовувати для створення нових процесів та взаємодії з їх вхідними та вихідними потоками даних. Простіше кажучи, ви можете використовувати його для запуску команд оболонки та запуску виконуваних двійкових файлів, зазвичай розкиданих у різних папках "bin" у файловій системі Linux. Ви також можете надати повний шлях до виконуваного двійкового файлу та використовувати будь-які перемикачі командного рядка, пов'язані з двійковим файлом. У цій статті буде пояснено, як використовувати модуль підпроцесу та його метод запуску в програмах Python. Усі зразки коду в статті перевірені на Python 3.8.2 на Ubuntu 20.04.

Підпроцес.метод запуску

Підпроцес.метод run бере список аргументів. Коли метод викликаний, він виконує команду і чекає завершення процесу, повертаючи в кінці об'єкт "CompletedProcess". Об'єкт “CompletedProcess” повертає stdout, stderr, оригінальні аргументи, що використовуються під час виклику методу, і код повернення. Stdout - це потік даних, створений командою, тоді як stderr - будь-які помилки, що виникають під час виконання програми. Будь-який ненульовий код повернення (код виходу) буде означати помилку з командою, виконаною в підпроцесі.метод запуску.

Приклад 1: Вихідний вміст текстового файлу з використанням підпроцесу.метод запуску

Наведена нижче команда видасть вміст даних.txt ”, припускаючи, що він містить рядок“ name = John ”.

підпроцес імпорту
підпроцес.запустити (["кішка", "дані.txt "])

Запуск наведеного вище коду поверне такий результат:

ім'я = Джон
CompletedProcess (args = ['cat', 'data.txt '], код повернення = 0)

Першим елементом аргументу списку є ім'я команди, яку потрібно виконати. Будь-який елемент у списку, що слідує за першим елементом, вважається параметрами командного рядка або перемикачами. Ви також можете використовувати одинарну риску та подвійну риску для визначення параметрів. Наприклад, щоб перерахувати файли та папки в каталозі, код буде «підпроцесом.запустити ([“ls”, “-l”] ”. У більшості з цих випадків будь-який аргумент, відокремлений пробілом у команді оболонки, можна розглядати як окремий елемент у списку, що надається підпроцесу.метод запуску.

Приклад 2: Придушення виходу підпроцесу.метод запуску

Для придушення виходу підпроцесу.метод запуску, вам доведеться вказати “stdout = subprocess.DEVNULL "та" stderr = підпроцес.DEVNULL ”як додаткові аргументи.

підпроцес імпорту
підпроцес.запустити (["кішка", "дані.txt "], stdout = підпроцес.ДЕВНУЛЬ,
stderr = підпроцес.DEVNULL)

Запуск наведеного вище коду дасть такий результат:

CompletedProcess (args = ['cat', 'data.txt '], код повернення = 0)

Приклад 3: Захоплення вихідних даних підпроцесу.метод запуску

Для захоплення вихідних даних підпроцесу.метод запуску, використовуйте додатковий аргумент з назвою “capture_output = True”.

підпроцес імпорту
вихід = підпроцес.запустити (["кішка", "дані.txt "], capture_output = True)
друк (вихід)

Запуск наведеного вище коду дасть такий результат:

CompletedProcess (args = ['cat', 'data.txt '], код повернення = 0,
stdout = b'name = John \ n ', stderr = b ")

Ви можете індивідуально отримати доступ до значень stdout та stderr, використовуючи “output”.stdout ”та“ output.stderr ”методи. Вихідні дані створюються у вигляді послідовності байтів. Щоб отримати рядок як вихід, використовуйте “output.stdout.метод декодування (“utf-8”) ”. Ви також можете вказати “text = True” як додатковий аргумент для підпроцесу.запустити виклик, щоб отримати результат у рядковому форматі. Щоб отримати код стану виходу, ви можете використовувати “вихід.метод повернення коду ”.

Приклад 4: Підвищити виняток за помилку команди, виконаної підпроцесом.метод запуску

Щоб викликати виняток, коли команда виходить із ненульовим станом, використовуйте аргумент “check = True”.

підпроцес імпорту
підпроцес.запустити (["кішка", "дані.tx "], capture_output = True, text = True, check = True)

Запуск наведеного вище коду дасть такий результат:

підняти CalledProcessError (перекодувати, обробити.аргументи,
підпроцес.CalledProcessError: Команда '[' cat ',' дані.tx ']'
повернуто ненульовий статус виходу 1.

Приклад 5: Передайте рядок команді, виконаній підпроцесом.метод запуску

Ви можете передати рядок команді, яка буде виконана підпроцесом.метод запуску за допомогою аргументу “input = 'string'”.

підпроцес імпорту
вихід = підпроцес.запустити (["cat"], input = "дані.txt ", capture_output = True,
text = True, check = True)
друк (вихід)

Запуск наведеного вище коду дасть такий результат:

CompletedProcess (args = ['cat'], returncode = 0, stdout = "дані.txt ", stderr =")

Як бачите, наведений вище код передає „дані.txt ”як рядок, а не як об’єкт файлу. Передати «дані.txt ”як файл, використовуйте аргумент“ stdin ”.

з відкритим ("data.txt ") як f:
вихід = підпроцес.run (["cat"], stdin = f, capture_output = True,
text = True, check = True)
друк (вихід)

Запуск наведеного вище коду дасть такий результат:

CompletedProcess (args = ['cat'], returncode = 0, stdout = "name = John \ n", stderr = ")

Приклад 6: Виконайте команду безпосередньо в оболонці, використовуючи підпроцес.метод запуску

Можна запустити команду безпосередньо в оболонку "як є", замість того, щоб використовувати розділений рядок в головній команді та параметрах, які слідують за нею. Для цього потрібно передати “shell = True” як додатковий аргумент. Однак це не рекомендується розробниками python, оскільки використання “shell = True” може призвести до проблем із безпекою. Детальніше про наслідки для безпеки ви можете прочитати тут.

підпроцес імпорту
підпроцес.run ("cat 'дані.txt '", оболонка = True)

Запуск наведеного вище коду дасть такий результат:

ім'я = Джон

Висновок

Підпроцес.метод run в Python досить потужний, оскільки дозволяє запускати команди оболонки всередині самого python. Це допомагає обмежити весь код самим python без необхідності мати додатковий код сценарію оболонки в окремих файлах. Однак може бути досить складно правильно визначити команди оболонки у списку пітонів. Ви можете використовувати “shlex.метод split () ”для токенізації простих команд оболонки, але в довгих, складних командах - особливо тих, що мають символи каналів - shlex не вдається правильно розділити команду. У таких випадках налагодження може бути складною проблемою. Щоб уникнути цього, ви можете використовувати аргумент “shell = True”, але з цією дією пов’язані певні проблеми безпеки.

Підручник Тінь розкрадача гробниць для Linux
Shadow of the Tomb Raider - дванадцяте доповнення до серії Tomb Raider - франшизи екшн-пригодницької гри, створеної Eidos Montreal. Гру сприйняли як к...
Як збільшити FPS в Linux?
FPS означає Кадри в секунду. Завданням FPS є вимірювання частоти кадрів при відтворенні відео або ігрових виставах. Простими словами кількість безпере...
Найкращі лабораторні ігри Oculus App
Якщо ви є власником гарнітури Oculus, то вам потрібно дізнатися про бокове завантаження. Бокове завантаження - це процес встановлення негарнітного вмі...