Како извршити наредбе љуске у Питхону користећи методу потпроцеса

How Execute Shell Commands Python Using Subprocess Run Method



Подпроцес је уграђени Питхон модул који се може користити за креирање нових процеса и интеракцију са њиховим улазним и излазним токовима података. Једноставније речено, можете га користити за покретање команди љуске и покретање извршних бинарних датотека обично разбацаних у различитим фасциклама за смеће по датотечном систему Линук. Такође можете доставити пуну путању до извршне бинарне датотеке и користити све прекидаче командне линије повезане са бинарном датотеком. Овај чланак ће објаснити како се користи модул потпроцеса и његов метод извођења у Питхон апликацијама. Сви узорци кода у чланку тестирани су помоћу Питхон 3.8.2 на Убунту 20.04.

Метод Потпроцес.рун

Метода Субпроцесс.рун узима листу аргумената. Када се метода позове, извршава наредбу и чека да се процес заврши, враћајући на крају објект ЦомплетедПроцесс. Објекат ЦомплетедПроцесс враћа стдоут, стдерр, оригиналне аргументе коришћене при позивању методе и повратни код. Стдоут се односи на ток података који је произвела команда, док се стдерр односи на све грешке настале током извршавања програма. Сваки повратни код различит од нуле (излазни код) би значио грешку са командом која се извршава у методи субпроцесс.рун.







Пример 1: Излазни садржај текстуалне датотеке помоћу методе Субпроцесс.рун

Команда испод ће приказати садржај датотеке дата.ткт, под претпоставком да садржи назив = низ Јохн.



увоз потпроцес
потпроцес.трцати(['мачка', 'дата.ткт'])

Покретање горњег кода ће вратити следеће резултате:



име=Јохн
ЦомплетедПроцесс(аргс=['мачка', 'дата.ткт'],повратни код=0)

Први елемент аргумента листе је име наредбе коју треба извршити. Сваки елемент на листи који следи иза првог елемента сматра се опцијама или прекидачима командне линије. За дефинисање опција можете користити и једну цртицу и двоструку цртицу. На пример, да бисте навели датотеке и фасцикле у директоријуму, код би био субпроцесс.рун ([лс, -л]. У већини ових случајева можете сматрати било који аргумент раздвојен размаком у команди љуске као појединачни елемент у списак достављен методи потпроцесс.рун.





Пример 2: Потиснути излаз методе Субпроцесс.рун

Да бисте потиснули излаз методе субпроцесс.рун, мораћете да наведете стдоут = субпроцесс.ДЕВНУЛЛ и стдерр = субпроцесс.ДЕВНУЛЛ као додатне аргументе.

увоз потпроцес

потпроцес.трцати(['мачка', 'дата.ткт'],стдоут=потпроцес.ДЕВНУЛЛ,
стдерр=потпроцес.ДЕВНУЛЛ)

Покретање горњег кода ће произвести следеће резултате:



ЦомплетедПроцесс (аргс = ['цат', 'дата.ткт'], ретурнцоде = 0)

Пример 3: Хватање излаза методе Субпроцесс.рун

Да бисте ухватили излаз методе субпроцесс.рун, користите додатни аргумент под називом цаптуре_оутпут = Труе.

увоз потпроцес
излаз= потпроцес.трцати(['мачка', 'дата.ткт'],цаптуре_оутпут=Истина)
принт (излаз)

Покретање горњег кода ће произвести следеће резултате:

ЦомплетедПроцесс(аргс=['мачка', 'дата.ткт'],повратни код=0,
стдоут=б'име = Јован н',стдерр=б'')

Можете појединачно приступити вредностима стдоут и стдерр користећи методе оутпут.стдоут и оутпут.стдерр. Излаз се производи као низ бајтова. Да бисте добили низ као излаз, користите методу оутпут.стдоут.децоде (утф-8). Такође можете навести тект = Труе као додатни аргумент позиву субпроцесс.рун да бисте добили излаз у формату стринга. Да бисте добили код статуса излаза, можете користити методу оутпут.ретурнцоде.

Пример 4: Подигните изузетак у случају неуспеха команде изведене методом Субпроцесс.рун

Да бисте покренули изузетак када команда изађе са статусом који није нула, користите аргумент цхецк = Труе.

увоз потпроцес
потпроцес.трцати(['мачка', 'дата.тк'],цаптуре_оутпут=Истина,текст=Истина,проверавати=Истина)

Покретање горњег кода ће произвести следеће резултате:

подићи ЦалледПроцессЕррор (ретцоде, процесс.аргс,
субпроцесс.ЦалледПроцессЕррор: Наредба '[' цат ',' дата.тк ']'
враћен статус излаза који није нула 1.

Пример 5: Пренесите низ наредби која се извршава методом Субпроцесс.рун

Можете да пренесете стринг у команду која ће се извршити методом субпроцесс.рун користећи аргумент инпут = 'стринг'.

увоз потпроцес
излаз= потпроцес.трцати(['мачка'], улазни='дата.ткт',цаптуре_оутпут=Истина,
текст=Истина,проверавати=Истина)
принт (излаз)

Покретање горњег кода ће произвести следеће резултате:

ЦомплетедПроцесс (аргс = ['цат'], ретурнцоде = 0, стдоут = 'дата.ткт', стдерр = '')

Као што видите, горњи код преноси дата.ткт као низ, а не као датотечни објекат. Да бисте проследили дата.ткт као датотеку, користите аргумент стдин.

са отворен('дата.ткт') каоф:
излаз= потпроцес.трцати(['мачка'],стдин=ф,цаптуре_оутпут=Истина,
текст=Истина,проверавати=Истина)
принт (излаз)

Покретање горњег кода ће произвести следеће резултате:

ЦомплетедПроцесс (аргс = ['цат'], ретурнцоде = 0, стдоут = 'наме = Јохн н', стдерр = '')

Пример 6: Извршите команду директно у љусци користећи методу Субпроцесс.рун

Могуће је покренути команду директно у љусци каква јесте, уместо да се низ дели у главној команди и опцијама које је прате. Да бисте то урадили, морате проћи схелл = Труе као додатни аргумент. Међутим, програмери питхона не обесхрабрују да коришћење схелл = Труе може довести до безбедносних проблема. Више о безбедносним импликацијама можете прочитати из овде .

увоз потпроцес
потпроцес.трцати('цат' дата.ткт '',шкољка=Истина)

Покретање горњег кода ће произвести следеће резултате:

име = Јован

Закључак

Метода субпроцесс.рун у Питхону је прилично моћна, јер вам омогућава да покрећете команде љуске унутар самог питхона. Ово помаже у ограничавању целог кода на сам питхон без потребе за додатним кодом скрипте љуске у засебним датотекама. Међутим, може бити прилично незгодно правилно означити команде љуске на списку питона. Можете користити методу схлек.сплит () за означавање једноставних команди љуске, али у дугим, сложеним командама - посебно онима са симболима цеви - схлек не успева правилно да подели команду. У таквим случајевима отклањање грешака може бити проблематично питање. Можете користити аргумент схелл = Труе да бисте то избегли, али постоје одређене безбедносне бриге повезане са овом радњом.