Как да изпълнявам команди на Shell в Python с помощта на метода на подпроцес Run

How Execute Shell Commands Python Using Subprocess Run Method



Подпроцесът е вграден модул на Python, който може да се използва за създаване на нови процеси и взаимодействие с техните входни и изходни потоци от данни. По -просто казано, можете да го използвате, за да изпълнявате команди на черупки и да изпълнявате изпълними двоични файлове, обикновено разпръснати в различни папки с контейнери в файлова система Linux. Можете също така да предоставите пълен път към изпълним двоичен файл и да използвате всички превключватели от командния ред, свързани с двоичния файл. Тази статия ще обясни как да използвате модула на подпроцеса и неговия метод на изпълнение в приложения на Python. Всички примерни кодове в статията са тествани с Python 3.8.2 на Ubuntu 20.04.

Методът Subprocess.run

Методът Subprocess.run взема списък с аргументи. Когато методът е извикан, той изпълнява командата и изчаква процеса да завърши, връщайки накрая обект CompletedProcess. Обектът CompletedProcess връща stdout, stderr, оригинални аргументи, използвани при извикване на метода, и код за връщане. Stdout се отнася до потока от данни, произведен от командата, докато stderr се отнася до всички грешки, възникнали по време на изпълнение на програмата. Всеки код за връщане, различен от нула (код за изход), би означавал грешка с командата, изпълнена в метода subprocess.run.







Пример 1: Извеждане на съдържанието на текстов файл с помощта на метода Subprocess.run

Командата по -долу ще изведе съдържанието на файл data.txt, като се приеме, че той съдържа име = John string.



внос подпроцес
подпроцес.бягай(['котка', 'data.txt'])

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



име=Джон
Завършен процес(аргументи=['котка', 'data.txt'],код за връщане=0)

Първият елемент на аргумента списък е името на командата, която трябва да бъде изпълнена. Всеки елемент в списъка, който следва първия елемент, се счита за опции или превключватели на командния ред. Можете също да използвате единични тирета и двойни тирета, за да дефинирате опциите. Например, за да се изброят файлове и папки в директория, кодът ще бъде subprocess.run ([ls, -l]. В повечето от тези случаи можете да считате всеки разделен с интервал аргумент в команда на черупка като отделен елемент в списъкът, предоставен на метода subprocess.run.





Пример 2: Потискане на изхода на метода Subprocess.run

За да потиснете изхода на метода subprocess.run, ще трябва да предоставите stdout = subprocess.DEVNULL и stderr = subprocess.DEVNULL като допълнителни аргументи.

внос подпроцес

подпроцес.бягай(['котка', 'data.txt'],stdout=подпроцес.DEVNULL,
stderr=подпроцес.DEVNULL)

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



CompletedProcess (args = ['cat', 'data.txt'], returncode = 0)

Пример 3: Заснемане на изхода на метода Subprocess.run

За да уловите изхода на метода subprocess.run, използвайте допълнителен аргумент, наречен capture_output = True.

внос подпроцес
изход= подпроцес.бягай(['котка', 'data.txt'],улавяне_изход=Вярно)
печат (изход)

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

Завършен процес(аргументи=['котка', 'data.txt'],код за връщане=0,
stdout=б'име = Джонн',stderr=б'')

Можете да получите индивидуален достъп до стойностите stdout и stderr, като използвате методите output.stdout и output.stderr. Изходът се произвежда като байтова последователност. За да получите низ като изход, използвайте метода output.stdout.decode (utf-8). Можете също да предоставите text = True като допълнителен аргумент за извикването на subprocess.run, за да получите изхода в низов формат. За да получите код за състояние на излизане, можете да използвате метода output.returncode.

Пример 4: Повишаване на изключение при неуспех на команда, изпълнена по метода Subprocess.run

За да повдигнете изключение, когато командата излезе със състояние, различно от нула, използвайте аргумента check = True.

внос подпроцес
подпроцес.бягай(['котка', 'data.tx'],улавяне_изход=Вярно,текст=Вярно,проверка=Вярно)

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

повдигнете CalledProcessError (retcode, process.args,
subprocess.CalledProcessError: Команда '[' cat ',' data.tx ']'
върна състояние на излизане от нула 1.

Пример 5: Предайте низ на команда, изпълнена по метода Subprocess.run

Можете да предадете низ на командата, която да се изпълни чрез метода subprocess.run, като използвате аргумент input = 'string'.

внос подпроцес
изход= подпроцес.бягай(['котка'], вход='data.txt',улавяне_изход=Вярно,
текст=Вярно,проверка=Вярно)
печат (изход)

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

CompletedProcess (args = ['cat'], returncode = 0, stdout = 'data.txt', stderr = '')

Както можете да видите, горният код предава data.txt като низ, а не като файлов обект. За да предадете data.txt като файл, използвайте аргумента stdin.

с отворен('data.txt') катоf:
изход= подпроцес.бягай(['котка'],stdin=е,улавяне_изход=Вярно,
текст=Вярно,проверка=Вярно)
печат (изход)

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

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

Пример 6: Изпълнете командата директно в Shell, използвайки метода Subprocess.run

Възможно е да изпълните команда директно в черупка такава, каквато е, вместо да използвате низ разделен в основната команда и опциите, които я следват. За да направите това, трябва да предадете shell = True като допълнителен аргумент. Това обаче не се обезкуражава от разработчиците на python, тъй като използването на shell = True може да доведе до проблеми със сигурността. Можете да прочетете повече за последиците за сигурността от тук .

внос подпроцес
подпроцес.бягай('cat' data.txt '',черупка=Вярно)

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

име = Джон

Заключение

Методът subprocess.run в Python е доста мощен, тъй като ви позволява да изпълнявате команди на shell в самия python. Това помага за ограничаване на целия код до самия python, без да е необходимо да има допълнителен код на скрипт на обвивката в отделни файлове. Може обаче да бъде доста трудно да се токенизират правилно командите на черупката в списъка на python. Можете да използвате метода shlex.split () за токенизиране на прости команди на черупка, но в дългите, сложни команди - особено тези със символи на тръбите - shlex не успява правилно да раздели командата. В такива случаи отстраняването на грешки може да бъде труден проблем. Можете да използвате аргумента shell = True, за да избегнете това, но има някои опасения за сигурността, свързани с това действие.