Kako izvršiti naredbe ljuske u Pythonu pomoću metode izvođenja podprocesa

How Execute Shell Commands Python Using Subprocess Run Method



Podproces je ugrađeni Python modul koji se može koristiti za stvaranje novih procesa i interakciju s njihovim ulaznim i izlaznim tokovima podataka. Jednostavnije rečeno, možete ga koristiti za pokretanje naredbi ljuske i pokretanje izvršnih binarnih datoteka obično razasutih u različitim mapama za smeće po datotečnom sustavu Linux. Također možete unijeti puni put do izvršne binarne datoteke i koristiti sve prekidače naredbenog retka povezane s binarnom datotekom. Ovaj članak će objasniti kako koristiti modul potprocesa i njegovu metodu izvođenja u Python aplikacijama. Svi uzorci koda u članku testirani su s Pythonom 3.8.2 na Ubuntu 20.04.

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 potproces

potproces.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 potproces
izlaz= 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 potproces
potproces.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 potproces
izlaz= 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 potproces
potproces.trčanje('cat' data.txt '',ljuska=Pravi)

Pokretanje gornjeg koda proizvest će sljedeće:

ime = Ivan

Zaključ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.