Metoda potprocesa.run
Metoda Subprocess.run uzima popis argumenata. Kada se metoda pozove, izvršava naredbu i čeka da se proces završi, vraćajući objekt CompletedProcess na kraju. Objekt CompletedProcess vraća stdout, stderr, izvorne argumente korištene pri pozivanju metode i povratni kôd. Stdout se odnosi na tok podataka koji stvara naredba, dok se stderr odnosi na sve pogreške nastale tijekom izvođenja programa. Svaki povratni kôd koji nije nulti (izlazni kôd) značio bi pogrešku s naredbom izvedenom u metodi subprocess.run.
Primjer 1: Izlazni sadržaj tekstualne datoteke pomoću metode Subprocess.run
Naredba u nastavku prikazat će sadržaj datoteke data.txt, pod pretpostavkom da sadrži naziv = niz John.
uvoz potproces
potproces.trčanje(['mačka', 'data.txt'])
Pokretanje gornjeg koda vratit će sljedeće rezultate:
Ime=Ivan
Završen proces(args=['mačka', 'data.txt'],povratni kôd=0)
Prvi element argumenta list je naziv naredbe koju treba izvršiti. Svi elementi na popisu koji slijede prvi element smatraju se opcijama ili prekidačima naredbenog retka. Za definiranje opcija možete koristiti i jednu crticu i dvostruku crticu. Na primjer, za popis datoteka i mapa u direktoriju, kôd bi bio potproces.run ([ls, -l]. U većini tih slučajeva možete smatrati bilo koji argument razgraničen razmakom u naredbi ljuske kao pojedinačni element u popis dostavljen metodi potproces.run.
Primjer 2: Suzbijanje izlaza metode Subprocess.run
Da biste potisnuli izlaz metode subprocess.run, morat ćete kao dodatne argumente navesti stdout = subprocess.DEVNULL i stderr = subprocess.DEVNULL.
uvoz potprocespotproces.trčanje(['mačka', 'data.txt'],stdout=potproces.DEVNULL,
stderr=potproces.DEVNULL)
Pokretanje gornjeg koda proizvest će sljedeće:
CompletedProcess (args = ['cat', 'data.txt'], returncode = 0)
Primjer 3: Hvatanje ispisa metode Subprocess.run
Da biste zabilježili izlaz metode subprocess.run, upotrijebite dodatni argument pod nazivom capture_output = True.
uvoz potprocesizlaz= potproces.trčanje(['mačka', 'data.txt'],hvatanje_izlaz=Pravi)
ispisati (izlaz)
Pokretanje gornjeg koda proizvest će sljedeće:
Završen proces(args=['mačka', 'data.txt'],povratni kôd=0,stdout=b'ime = Ivan n',stderr=b'')
Vrijednostima stdout i stderr možete pojedinačno pristupiti pomoću metoda output.stdout i output.stderr. Izlaz se proizvodi kao niz bajtova. Da biste dobili niz kao izlaz, upotrijebite output.stdout.decode (utf-8) metodu. Također možete unijeti text = True kao dodatni argument pozivu subprocess.run da biste dobili izlaz u formatu niza. Da biste dobili kôd statusa izlaza, možete koristiti metodu output.returncode.
Primjer 4: Podignite iznimku u slučaju neuspjeha naredbe izvedene metodom Subprocess.run
Da biste pokrenuli iznimku kada naredba izađe s statusom koji nije nula, upotrijebite argument check = True.
uvoz potprocespotproces.trčanje(['mačka', 'data.tx'],hvatanje_izlaz=Pravi,tekst=Pravi,ček=Pravi)
Pokretanje gornjeg koda proizvest će sljedeće:
podići CalledProcessError (retcode, process.args,potproces.CalledProcessError: Naredba '[' cat ',' data.tx ']'
vraćen status izlaza koji nije nula 1.
Primjer 5: Prenesite niz naredbi koja se izvršava metodom Subprocess.run
Možete predati niz naredbi koja će se izvršiti metodom subprocess.run pomoću argumenta input = 'string'.
uvoz potprocesizlaz= potproces.trčanje(['mačka'], ulazni='data.txt',hvatanje_izlaz=Pravi,
tekst=Pravi,ček=Pravi)
ispisati (izlaz)
Pokretanje gornjeg koda proizvest će sljedeće:
CompletedProcess (args = ['cat'], returncode = 0, stdout = 'data.txt', stderr = '')Kao što vidite, gornji kod prenosi data.txt kao niz, a ne kao datotečni objekt. Za prosljeđivanje data.txt kao datoteke upotrijebite argument stdin.
s otvorena('data.txt') kaof:izlaz= potproces.trčanje(['mačka'],stdin=f,hvatanje_izlaz=Pravi,
tekst=Pravi,ček=Pravi)
ispisati (izlaz)
Pokretanje gornjeg koda proizvest će sljedeće:
CompletedProcess (args = ['cat'], returncode = 0, stdout = 'name = John n', stderr = '')Primjer 6: Izvedite naredbu izravno u ljusci pomoću metode Subprocess.run
Moguće je pokrenuti naredbu izravno u ljusci kakva jest, umjesto korištenja niza podijeljenog u glavnoj naredbi i opcija koje slijede. Da biste to učinili, morate proslijediti shell = True kao dodatni argument. Međutim, programeri pythona ne ohrabruju ovo jer upotreba ljuske = True može dovesti do sigurnosnih problema. Više o sigurnosnim implikacijama možete pročitati iz ovdje .
uvoz potprocespotproces.trčanje('cat' data.txt '',ljuska=Pravi)
Pokretanje gornjeg koda proizvest će sljedeće:
ime = IvanZaključak
Metoda subprocess.run 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 zasebnim datotekama. Međutim, može biti prilično teško ispravno tokenizirati naredbe ljuske na popisu pythona. Možete koristiti metodu shlex.split () za tokeniziranje jednostavnih naredbi ljuske, ali u dugim, složenim naredbama - posebno onima sa simbolima cijevi - shlex ne uspijeva pravilno podijeliti naredbu. U takvim slučajevima ispravljanje pogrešaka može biti zeznut problem. Da biste to izbjegli, možete koristiti argument ljuske = True, ali postoje određene sigurnosne zabrinutosti povezane s ovom radnjom.