Подпроцесът.метод на изпълнение
Подпроцесът.методът run взема списък с аргументи. Когато методът бъде извикан, той изпълнява командата и изчаква процесът да завърши, връщайки обект “CompletedProcess” в края. Обектът „CompletedProcess“ връща stdout, stderr, оригинални аргументи, използвани при извикване на метода, и код за връщане. Stdout се отнася до потока от данни, произведен от командата, докато stderr се отнася до всички грешки, възникнали по време на изпълнение на програмата. Всеки ненулев код за връщане (изходен код) би означавал грешка в командата, изпълнена в подпроцеса.метод на изпълнение.
Пример 1: Изходно съдържание на текстов файл, използващ подпроцеса.метод на изпълнение
Командата по-долу ще изведе съдържанието на „данни.txt “, като се предполага, че съдържа низ„ name = John “.
импортиране на подпроцесподпроцес.тичане (["котка", "данни.текст"])
Изпълнението на горния код ще върне следния изход:
име = ДжонCompletedProcess (args = ['cat', 'data.txt '], код за връщане = 0)
Първият елемент на аргумента на списъка е името на командата, която трябва да бъде изпълнена. Всеки елемент в списъка, който следва първия елемент, се счита за опции или превключватели на командния ред. Можете също да използвате единично тире и двойно тире, за да дефинирате опциите. Например, за да се изброят файлове и папки в директория, кодът ще бъде „подпроцес.тичане ([„ls“, „-l“] “. В повечето от тези случаи можете да разгледате всеки аргумент, разделен с интервал в командата на обвивката, като отделен елемент в списъка, предоставен на подпроцеса.метод на изпълнение.
Пример 2: Потискане на изхода на подпроцеса.метод на изпълнение
За потискане на изхода на подпроцеса.run метод, ще трябва да предоставите “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“ като допълнителен аргумент към подпроцеса.стартирайте повикване, за да получите изхода в низ формат. За да получите код за състояние на изхода, можете да използвате „изход.returncode ”метод.
Пример 4: Повишаване на изключение при неуспех на командата, изпълнена от подпроцес.метод на изпълнение
За да създадете изключение, когато командата излиза с ненулево състояние, използвайте аргумента “check = True”.
импортиране на подпроцесподпроцес.тичане (["котка", "данни.tx "], capture_output = True, text = True, check = True)
Изпълнението на горния код ще даде следния резултат:
повишаване на CalledProcessError (рекодиране, обработка.аргументи,подпроцес.CalledProcessError: Команда '[' котка ',' данни.tx ']'
върна ненулево състояние на изход 1.
Пример 5: Предаване на низ в команда, изпълнена от подпроцеса.метод на изпълнение
Можете да предадете низ на командата, която да бъде изпълнена чрез подпроцес.метод на изпълнение с помощта на аргумент “input = 'string'”.
импортиране на подпроцесизход = подпроцес.стартиране (["котка"], вход = "данни.txt ", capture_output = Вярно,
text = True, check = True)
печат (изход)
Изпълнението на горния код ще даде следния резултат:
CompletedProcess (args = ['cat'], returncode = 0, stdout = "данни.txt ", stderr =")Както можете да видите, горният код предава „данни.txt ”като низ, а не като файлов обект. За предаване на „данни.txt ”като файл, използвайте аргумента“ stdin ”.
с отворен ("данни.txt ") като f:изход = подпроцес.стартиране (["котка"], stdin = f, capture_output = True,
text = True, check = True)
печат (изход)
Изпълнението на горния код ще даде следния резултат:
CompletedProcess (args = ['cat'], returncode = 0, stdout = "name = John \ n", stderr = ")Пример 6: Изпълнете командата директно в Shell, използвайки подпроцеса.метод на изпълнение
Възможно е да стартирате команда директно в черупката „както е“, вместо да използвате разделен низ в основната команда и опциите, които я следват. За да направите това, трябва да предадете “shell = True” като допълнителен аргумент. Това обаче е обезкуражено от разработчиците на python, тъй като използването на „shell = True“ може да доведе до проблеми със сигурността. Можете да прочетете повече за последиците за сигурността от тук.
импортиране на подпроцесподпроцес.run ("котка" данни.txt '", черупка = Вярно)
Изпълнението на горния код ще даде следния резултат:
име = ДжонЗаключение
Подпроцесът.run методът в Python е доста мощен, тъй като ви позволява да изпълнявате команди на черупки в самия python. Това помага при ограничаването на целия код до самия python, без да е необходимо да имате допълнителен код на скрипт на черупката в отделни файлове. Може обаче да е доста сложно да се маркират правилно командите на черупки в списък на python. Можете да използвате „shlex.метод split () ”за токенизиране на прости команди на черупката, но при дълги, сложни команди - особено тези с символи на тръби - shlex не успява да раздели правилно командата. В такива случаи отстраняването на грешки може да бъде труден проблем. Можете да използвате аргумента „shell = True“, за да избегнете това, но има определени проблеми със сигурността, свързани с това действие.