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 procesaspapildomas 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 procesasprodukcija= 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 procesaspapildomas 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 procesasprodukcija= 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 procesaspapildomas procesas.bėgti(„katė“ data.txt “,apvalkalas=Tiesa)
Paleidus aukščiau esantį kodą bus gaunama tokia išvestis:
vardas = JonasIš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.