Potproces.trčanje Metoda
Potproces.run metoda uzima popis argumenata. Kada se metoda pozove, izvršava naredbu i čeka da se postupak završi, vraćajući na kraju objekt „CompletedProcess“. Objekt “CompletedProcess” vraća stdout, stderr, izvorne argumente korištene tijekom pozivanja metode i povratni kôd. Stdout se odnosi na tok podataka koji je stvorila naredba, dok se stderr odnosi na sve pogreške nastale tijekom izvršavanja programa. Bilo koji povratni kôd koji nije nula (izlazni kôd) značio bi pogrešku u naredbi koja se izvršava u potprocesu.metoda pokretanja.
Primjer 1: Izlazni sadržaj tekstualne datoteke koja koristi potproces.trčanje Metoda
Naredba u nastavku prikazat će sadržaj "podataka.txt ", pod pretpostavkom da sadrži niz" name = John ".
uvozni potprocespotproces.run (["mačka", "podaci.txt "])
Pokretanje gornjeg koda vratit će sljedeći izlaz:
ime = IvanCompletedProcess (args = ['mačka', 'podaci.txt '], povratni kôd = 0)
Prvi element argumenta popisa je ime naredbe koju treba izvršiti. Bilo koji element na popisu koji slijedi prvi element smatra se opcijama ili prekidačima naredbenog retka. Za definiranje opcija možete upotrijebiti i jednu crticu i dvostruku crticu. Na primjer, za popis datoteka i mapa u direktoriju, kôd bi bio „potproces.pokreni ([“ls”, “-l”] ”. U većini tih slučajeva bilo koji argument odvojen razmakom u naredbi ljuske možete smatrati pojedinačnim elementom na popisu dostavljenom potprocesu.metoda pokretanja.
Primjer 2: Suzbijanje izlaza potprocesa.pokreni metodu
Da bi se potisnuo izlaz potprocesa.run metoda, morat ćete unijeti “stdout = subprocess.DEVNULL "i" stderr = potproces.DEVNULL ”kao dodatni argumenti.
uvozni potprocespotproces.run (["mačka", "podaci.txt "], stdout = potproces.DOŽAVLJENO,
stderr = potproces.DEVNULL)
Pokretanje gornjeg koda rezultirat će sljedećim rezultatima:
CompletedProcess (args = ['mačka', 'podaci.txt '], povratni kôd = 0)Primjer 3: Hvatanje rezultata potprocesa.pokreni metodu
Za hvatanje rezultata potprocesa.metoda izvođenja, upotrijebite dodatni argument pod nazivom "capture_output = True".
uvozni potprocesizlaz = potproces.run (["mačka", "podaci.txt "], capture_output = True)
ispis (izlaz)
Pokretanje gornjeg koda rezultirat će sljedećim rezultatima:
CompletedProcess (args = ['mačka', 'podaci.txt '], povratni kôd = 0,stdout = b'name = John \ n ', stderr = b ")
Vrijednostima stdout i stderr možete pristupiti pojedinačno pomoću “output.stdout “i„ output.stderr ”metode. Izlaz se proizvodi kao niz bajtova. Da biste dobili niz kao izlaz, upotrijebite “output.stdout.metoda dekodiranja ("utf-8"). Također možete unijeti "text = True" kao dodatni argument potprocesu.pokrenite poziv da biste dobili izlaz u formatu niza. Da biste dobili kod statusa izlaza, možete upotrijebiti „izlaz.return code ”metoda.
Primjer 4: Povećajte iznimku zbog neuspjeha naredbe izvršene podprocesom.trčanje Metoda
Da biste pokrenuli iznimku kada naredba izađe sa statusom koji nije nula, upotrijebite argument "check = True".
uvozni potprocespotproces.run (["mačka", "podaci.tx "], capture_output = True, text = True, check = True)
Pokretanje gornjeg koda rezultirat će sljedećim rezultatima:
podići CalledProcessError (ponovni kod, obraditi.svađe,potproces.CalledProcessError: Naredba '[' mačka ',' podaci.tx ']'
vratio status izlaza koji nije nula 1.
Primjer 5: Proslijedite niz naredbi koju izvršava potproces.pokreni metodu
Možete naredbi proslijediti niz koji će se izvršiti potprocesom.run metoda pomoću argumenta “input = 'string'”.
uvozni potprocesizlaz = potproces.run (["cat"], input = "podaci.txt ", capture_output = Tačno,
text = True, check = True)
ispis (izlaz)
Pokretanje gornjeg koda rezultirat će sljedećim rezultatima:
CompletedProcess (args = ['cat'], returncode = 0, stdout = "podaci.txt ", stderr =")Kao što vidite, gornji kod prenosi „podatke.txt ”kao niz, a ne kao objekt datoteke. Za prosljeđivanje „podataka.txt "kao datoteku, koristite argument" stdin ".
s otvorenim ("podaci.txt ") kao f:izlaz = potproces.run (["cat"], stdin = f, capture_output = True,
text = True, check = True)
ispis (izlaz)
Pokretanje gornjeg koda rezultirat će sljedećim rezultatima:
CompletedProcess (args = ['cat'], returncode = 0, stdout = "name = John \ n", stderr = ")Primjer 6: Izvršite naredbu izravno u ljusci pomoću potprocesa.trčanje Metoda
Naredbu je moguće izravno pokrenuti u ljusku "kakva jest", umjesto da se u glavnoj naredbi i opcijama koje slijede podjele niza. Da biste to učinili, morate dodati "shell = True" kao dodatni argument. Međutim, programeri pythona to obeshrabruju jer korištenje "shell = True" može dovesti do sigurnosnih problema. Ovdje možete pročitati više o sigurnosnim implikacijama.
uvozni potprocespotproces.run ("podaci mačke".txt '", ljuska = True)
Pokretanje gornjeg koda rezultirat će sljedećim rezultatima:
ime = IvanZaključak
Potproces.run metoda u Pythonu prilično je moćna, jer vam omogućuje pokretanje naredbi ljuske unutar samog pythona. To pomaže u ograničavanju cijelog koda na sam python, bez potrebe za dodatnim kodom skripte ljuske u odvojenim datotekama. Međutim, može biti prilično nezgodno ispravno označiti naredbe ljuske na popisu pythona. Možete koristiti „shlex.metoda split () ”za označavanje jednostavnih naredbi ljuske, ali u dugim, složenim naredbama - posebno onima s simbolima cijevi - shlex ne uspije pravilno podijeliti naredbu. U takvim slučajevima otklanjanje pogrešaka može biti nezgodan problem. Da biste to izbjegli, možete upotrijebiti argument "shell = True", ali s ovom su akcijom povezane određene sigurnosne nedoumice.