„Python“

Kaip vykdyti „Shell“ komandas „Python“ naudojant subproceso vykdymo metodą

Kaip vykdyti „Shell“ komandas „Python“ naudojant subproceso vykdymo metodą
„Subprocess“ yra įmontuotas „Python“ modulis, kurį galima naudoti kuriant naujus procesus ir sąveikaujant su jų įvesties ir išvesties duomenų srautais. Paprasčiau tariant, galite naudoti jį paleisti apvalkalo komandas ir paleisti vykdomuosius dvejetainius failus, paprastai išsibarsčiusius įvairiuose „bin“ aplankuose „Linux“ failų sistemoje. Taip pat galite pateikti visą vykdomojo dvejetainio failo kelią ir naudoti bet kokius komandų eilutės jungiklius, susietus su dvejetainiu. Šiame straipsnyje bus paaiškinta, kaip naudoti antrinio proceso modulį ir jo vykdymo metodą „Python“ programose. Visi straipsnio pavyzdžiai yra išbandomi naudojant „Python 3“.8.2 „Ubuntu 20“.04.

Potvarkis.paleisti metodą

Potvarkis.metodas paleidžia argumentų sąrašą. Kai metodas iškviečiamas, jis vykdo komandą ir laukia, kol procesas bus baigtas, galų gale pateikdamas objektą „CompletedProcess“. Objektas „CompletedProcess“ pateikia stdout, stderr, originalius argumentus, naudojamus iškviečiant metodą, ir grąžinimo kodą. „Stdout“ reiškia duomenų srautą, kurį sukuria komanda, o „stderr“ - klaidas, iškilusias vykdant programą. Bet koks nulio grąžinimo kodas (išėjimo kodas) reikštų klaidą vykdant komandą, vykdomą pakopoje.paleidimo metodas.

1 pavyzdys: Teksto failo išvesties turinys naudojant antrinį procesą.paleisti metodą

Žemiau pateikta komanda išves „duomenų.txt “failas, darant prielaidą, kad jame yra„ name = John “eilutė.

importo antrinis procesas
antrinis procesas.paleisti (["katė", "duomenys.txt "])

Paleidus aukščiau esantį kodą bus grąžinta ši išvestis:

vardas = Jonas
CompletedProcess (args = ['katė', 'duomenys.txt '], grąžinimo kodas = 0)

Pirmasis sąrašo argumento elementas yra vykdytinos komandos pavadinimas. Bet kuris sąrašo elementas, einantis po pirmo elemento, laikomas komandinės eilutės parinktimis arba jungikliais. Taip pat galite naudoti vieno brūkšnio ir dvigubus brūkšnelius, kad apibrėžtumėte parinktis. Pavyzdžiui, norint kataloge išvardyti failus ir aplankus, kodas būtų „subprocess.paleisti ([„ls“, „-l“] “. Dažniausiai šiais atvejais bet kurį apvalkalo komandoje esantį tarpą atskirtą argumentą galite laikyti atskiru elementu sąraše, pateiktame pakopai.paleidimo metodas.

2 pavyzdys: nutraukti antrinio proceso išvestį.paleisti metodą

Norėdami užgniaužti pakopos išvestį.paleidimo metodą, turėsite pateikti „stdout = subprocess“.DEVNULL “ir„ stderr = antrinis procesas.DEVNULL “kaip papildomus argumentus.

importo antrinis procesas
antrinis procesas.paleisti (["katė", "duomenys.txt "], stdout = antrinis procesas.DEVNULL,
stderr = antrinis procesas.DEVNULL)

Paleidus aukščiau esantį kodą bus sukurtas toks išvestis:

CompletedProcess (args = ['katė', 'duomenys.txt '], grąžinimo kodas = 0)

3 pavyzdys: užfiksuokite antrinio proceso išvestį.paleisti metodą

Norėdami užfiksuoti antrinio proceso rezultatus.paleidimo metodą, naudokite papildomą argumentą pavadinimu „capture_output = True“.

importo antrinis procesas
produkcija = antrinis procesas.paleisti (["katė", "duomenys.txt "], capture_output = True)
spausdinti (išvestis)

Paleidus aukščiau esantį kodą bus sukurtas toks išvestis:

CompletedProcess (args = ['katė', 'duomenys.txt '], grįžimo kodas = 0,
stdout = b'name = John \ n ', stderr = b ")

Galite atskirai pasiekti „stdout“ ir „stderr“ reikšmes naudodami „output“.stdout “ir„ produkcija.stderr “metodai. Išvestis gaminama kaip baitų seka. Norėdami gauti eilutę kaip išvestį, naudokite „output“.stdout.dekoduoti („utf-8“) “metodą. Taip pat galite pateikti „text = True“ kaip papildomą argumentą antriniam procesui.paleisti skambutį, kad gautumėte išvestį eilutės formatu. Norėdami gauti išėjimo būsenos kodą, galite naudoti išvestį.grįžimo kodas “metodą.

4 pavyzdys. Padidinkite išimtį dėl nesugebėjimo vykdyti komandą, vykdomo pakopinio proceso metu.paleisti metodą

Norėdami išimti išimtį, kai komanda išeina su nulio būsena, naudokite argumentą „check = True“.

importo antrinis procesas
antrinis procesas.paleisti (["katė", "duomenys.tx "], capture_output = True, text = True, check = True)

Paleidus aukščiau esantį kodą bus sukurtas toks išvestis:

pakelti CalledProcessError (perkoduoti, apdoroti.argumentuoja,
antrinis procesas.CalledProcessError: komanda „[“ katė “,“ duomenys.tx ']'
grąžino nulio nulinę išėjimo būseną 1.

5 pavyzdys: perduokite eilutę komandai, kurią vykdo antrinis procesas.paleisti metodą

Galite perduoti eilutę komandai, kuri bus vykdoma pagal antrinį procesą.paleisti metodą, naudojant argumentą „input = 'string' '.

importo antrinis procesas
produkcija = antrinis procesas.paleisti (["katė"], input = "duomenys.txt ", capture_output = Tiesa,
tekstas = tiesa, patikrinkite = tiesa)
spausdinti (išvestis)

Paleidus aukščiau esantį kodą bus sukurtas toks išvestis:

CompletedProcess (args = ['katė'], grįžimo kodas = 0, stdout = "duomenys.txt ", stderr =")

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

su atviraisiais ("duomenimis.txt ") kaip f:
produkcija = antrinis procesas.paleisti (["katė"], stdin = f, capture_output = True,
tekstas = tiesa, patikrinkite = tiesa)
spausdinti (išvestis)

Paleidus aukščiau esantį kodą bus sukurtas toks išvestis:

„CompletedProcess“ (args = ['katė'], grįžimo kodas = 0, stdout = "vardas = Jonas \ n", stderr = ")

6 pavyzdys: vykdykite komandą tiesiogiai „Shell“, naudodami antrinį procesą.paleisti metodą

Komandą galima paleisti tiesiai į apvalkalą „koks yra“, užuot naudojus eilutę, padalytą pagrindinėje komandoje ir po jos esančiomis parinktimis. Norėdami tai padaryti, turite perduoti „shell = True“ kaip papildomą argumentą. Tačiau Python kūrėjai to nenori, nes naudojant „shell = True“ gali kilti saugumo problemų. Čia galite daugiau sužinoti apie saugumo pasekmes.

importo antrinis procesas
antrinis procesas.paleisti ("katės" duomenys.txt '", apvalkalas = Tiesa)

Paleidus aukščiau esantį kodą bus sukurtas toks išvestis:

vardas = Jonas

Išvada

Procesas.„Run“ metodas „Python“ yra gana galingas, nes leidžia paleisti apvalkalo komandas pačiame „Python“. Tai padeda apriboti visą kodą iki paties pitono, nereikalaujant papildomo apvalkalo scenarijaus kodo atskiruose failuose. Tačiau gali būti gana keblu teisingai žymėti apvalkalo komandas pitonų sąraše. Galite naudoti „shlex.split () “metodas paprastoms apvalkalo komandoms žymėti, tačiau ilgose, sudėtingose ​​komandose, ypač turinčiose vamzdžių simbolius, shlex nepavyksta teisingai padalyti komandos. Tokiais atvejais derinimas gali būti keblus klausimas. Norėdami to išvengti, galite naudoti argumentą „shell = True“, tačiau su šiuo veiksmu yra susijusių tam tikrų saugumo problemų.

Populiariausi „Oculus App Lab“ žaidimai
Jei esate „Oculus“ laisvų rankų įrangos savininkas, turite žinoti, kaip krauti iš šono. Šoninis įkėlimas yra ne parduotuvėje esančio turinio įdiegimas...
10 geriausių žaidimų, kuriuos reikia žaisti naudojant „Ubuntu“
„Windows“ platforma buvo viena iš dominuojančių žaidimų platformų dėl didžiulio procento žaidimų, kurie šiandien kuriami natūraliai palaikant „Windows...
5 geriausi „Arcade“ žaidimai, skirti „Linux“
Šiais laikais kompiuteriai yra rimta mašina, naudojama žaidimams. Jei negalėsite gauti naujo aukšto rezultato, žinosite, ką noriu pasakyti. Šiame įraš...