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 “.

импортиране на подпроцес
подпроцес.тичане (["котка", "данни.текст"])

Изпълнението на горния код ще върне следния изход:

име = Джон
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“, за да избегнете това, но има определени проблеми със сигурността, свързани с това действие.

Топ Oculus App Lab Games
Ако сте собственик на слушалки на Oculus, тогава трябва да знаете за странично зареждане. Sideloading е процесът на инсталиране на несъхранявано съдър...
Топ 10 игри за игра на Ubuntu
Платформата на Windows е една от доминиращите платформи за игри поради огромния процент игри, които се развиват днес, за да поддържат Windows. Може ли...
5 най-добри аркадни игри за Linux
В днешно време компютрите са сериозни машини, използвани за игри. Ако не можете да получите новия висок резултат, ще разберете какво имам предвид. В т...