Kaip vykdyti „Shell“ komandas „Python“ naudojant papildomo proceso vykdymo metodą

How Execute Shell Commands Python Using Subprocess Run Method



Papildomas procesas yra integruotas „Python“ modulis, kurį galima naudoti kuriant naujus procesus ir sąveikaujant su jų įvesties ir išvesties duomenų srautais. Paprasčiau tariant, galite jį naudoti norėdami paleisti apvalkalo komandas ir vykdyti vykdomuosius dvejetainius failus, kurie paprastai yra išsibarstę po įvairius „Linux“ failų sistemos aplankus. Taip pat galite pateikti visą kelią į vykdomąjį dvejetainį failą ir naudoti bet kokius su dvejetainiu susietus komandinės eilutės jungiklius. Šiame straipsnyje bus paaiškinta, kaip naudoti papildomo proceso modulį ir jo vykdymo metodą „Python“ programose. Visi straipsnyje esantys kodo pavyzdžiai yra išbandyti naudojant „Python 3.8.2“, skirtą „Ubuntu 20.04“.

Subprocess.run metodas

Subprocess.run metodas apima argumentų sąrašą. Kai metodas iškviečiamas, jis vykdo komandą ir laukia proceso pabaigos, o galų gale grąžina objektą „CompletedProcess“. Objektas „CompletedProcess“ pateikia stdout, stderr, originalius argumentus, naudojamus skambinant metodui, ir grąžinimo kodą. „Stdout“ reiškia komandos sukurtą duomenų srautą, o „stderr“ nurodo visas klaidas, iškilusias vykdant programą. Bet koks ne nulinis grąžinimo kodas (išėjimo kodas) reikštų klaidą su komanda, vykdoma subprocess.run metodu.







1 pavyzdys: teksto failo išvesties turinys naudojant Subprocess.run metodą

Toliau pateikta komanda išves failo data.txt turinį, darant prielaidą, kad jame yra vardas = Jonas.



importas papildomas procesas
papildomas procesas.bėgti(['katė', „data.txt“])

Paleidus aukščiau esantį kodą, bus pateikta tokia išvestis:



vardas=Jonas
Užbaigtas Procesas(args=['katė', „data.txt“],grįžimo kodas=0)

Pirmasis sąrašo argumento elementas yra vykdytinos komandos pavadinimas. Bet kuris sąrašo elementas, einantis po pirmojo elemento, laikomas komandinės eilutės parinktimis arba jungikliais. Norėdami apibrėžti parinktis, taip pat galite naudoti vieną brūkšnį ir dvigubus brūkšnius. Pvz., Kad būtų galima išvardyti katalogo failus ir aplankus, kodas būtų subprocess.run ([ls, -l]. Daugeliu atvejų bet kurį atskirą tarpo argumentą apvalkalo komandoje galite laikyti atskiru elementu sąrašas, pateiktas pagal subprocess.run metodą.





2 pavyzdys: Slopinti Subprocess.run metodo išvestį

Norėdami sustabdyti subprocess.run metodo išvestį, kaip papildomus argumentus turėsite pateikti stdout = subprocess.DEVNULL ir stderr = subprocess.DEVNULL.

importas papildomas procesas

papildomas procesas.bėgti(['katė', „data.txt“],stdout=papildomas procesas.DEVNULLAS,
stderr=papildomas procesas.DEVNULLAS)

Paleidus aukščiau esantį kodą bus gaunama tokia išvestis:



„CompletedProcess“ (args = ['katė', 'data.txt'], grįžimo kodas = 0)

3 pavyzdys: Subprocess.run metodo fiksavimas

Norėdami užfiksuoti subprocess.run metodo išvestį, naudokite papildomą argumentą, pavadintą capture_output = True.

importas papildomas procesas
produkcija= papildomas procesas.bėgti(['katė', „data.txt“],capture_output=Tiesa)
spausdinti (produkcija)

Paleidus aukščiau esantį kodą bus gaunama tokia išvestis:

Užbaigtas Procesas(args=['katė', „data.txt“],grįžimo kodas=0,
stdout=b'vardas = Jonas n',stderr=b'')

Galite atskirai pasiekti stdout ir stderr reikšmes naudodami output.stdout ir output.stderr metodus. Išvestis gaminama kaip baitų seka. Norėdami gauti eilutę kaip išvestį, naudokite output.stdout.decode (utf-8) metodą. Taip pat galite pateikti tekstą = tiesa kaip papildomą argumentą subprocess.run iškvietimui, kad gautumėte išvestį eilutės formatu. Norėdami gauti išėjimo būsenos kodą, galite naudoti output.returncode metodą.

4 pavyzdys. Padidinkite išimtį dėl nesėkmingos komandos, įvykdytos Subprocess.run metodu

Norėdami padidinti išimtį, kai komanda išeina esant nuliniam statusui, naudokite argumentą check = True.

importas papildomas procesas
papildomas procesas.bėgti(['katė', 'data.tx'],capture_output=Tiesa,tekstas=Tiesa,patikrinti=Tiesa)

Paleidus aukščiau esantį kodą bus gaunama tokia išvestis:

pakelti CalledProcessError (retcode, process.args,
subprocess.CalledProcessError: Komanda '[' cat ',' data.tx ']'
grąžino nulinę išėjimo būseną 1.

5 pavyzdys: perduokite eilutę komandai, vykdomai pagal subprocess.run metodą

Galite perduoti eilutę komandai, kuri bus vykdoma naudojant subprocess.run metodą, naudojant argumentą input = ’string’.

importas papildomas procesas
produkcija= papildomas procesas.bėgti(['katė'], įvesties=„data.txt“,capture_output=Tiesa,
tekstas=Tiesa,patikrinti=Tiesa)
spausdinti (produkcija)

Paleidus aukščiau esantį kodą bus gaunama tokia išvestis:

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

Kaip matote, aukščiau pateiktas kodas duomenis.txt perduoda kaip eilutę, o ne kaip failo objektą. Norėdami perduoti failą data.txt kaip failą, naudokite argumentą stdin.

su atviras(„data.txt“) kaipf:
produkcija= papildomas procesas.bėgti(['katė'],stdin=f,capture_output=Tiesa,
tekstas=Tiesa,patikrinti=Tiesa)
spausdinti (produkcija)

Paleidus aukščiau esantį kodą bus gaunama tokia išvestis:

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

6 pavyzdys: vykdykite komandą tiesiogiai „Shell“ naudodami Subprocess.run metodą

Komandą galima paleisti tiesiai į apvalkalą tokią, kokia yra, o ne naudoti eilutės padalijimą pagrindinėje komandoje ir po jos einančias parinktis. Norėdami tai padaryti, kaip papildomą argumentą turite perduoti „shell = True“. Tačiau „Python“ kūrėjai to neskatina, nes naudojant „shell = True“ gali kilti saugumo problemų. Daugiau apie saugumo padarinius galite perskaityti iš čia .

importas papildomas procesas
papildomas procesas.bėgti(„katė“ data.txt “,apvalkalas=Tiesa)

Paleidus aukščiau esantį kodą bus gaunama tokia išvestis:

vardas = Jonas

Išvada

Subprocess.run metodas „Python“ yra gana galingas, nes leidžia paleisti „shell“ komandas pačiame „python“. Tai padeda apriboti visą kodą iki paties „python“, nereikalaujant papildomo apvalkalo scenarijaus kodo atskiruose failuose. Tačiau gali būti gana sudėtinga teisingai pažymėti apvalkalo komandas python sąraše. Galite naudoti metodą shlex.split (), norėdami pažymėti paprastas apvalkalo komandas, tačiau ilgose sudėtingose ​​komandose, ypač tose, kuriose yra vamzdžio simboliai, „shlex“ nepavyksta teisingai padalyti komandos. Tokiais atvejais derinimas gali būti sudėtinga problema. Norėdami to išvengti, galite naudoti argumentą „shell = True“, tačiau yra tam tikrų saugumo problemų, susijusių su šiuo veiksmu.