Підпроцес.метод запуску
Підпроцес.метод 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”, але з цією дією пов’язані певні проблеми безпеки.