Piton

Cum se execută comenzi Shell în Python folosind metoda Run Subprocess

Cum se execută comenzi Shell în Python folosind metoda Run Subprocess
Subprocesul este un modul Python încorporat care poate fi utilizat pentru a crea noi procese și a interacționa cu fluxurile lor de date de intrare și ieșire. În termeni mai simpli, îl puteți folosi pentru a rula comenzi shell și pentru a rula binare executabile, de obicei împrăștiate în diferite foldere „bin” pe un sistem de fișiere Linux. De asemenea, puteți furniza o cale completă către un binar executabil și puteți utiliza orice comutatoare de linie de comandă asociate binarului. Acest articol va explica cum să utilizați modulul de subproces și metoda de rulare a acestuia în aplicațiile Python. Toate probele de cod din articol sunt testate cu Python 3.8.2 pe Ubuntu 20.04.

Subprocesul.rulați Metoda

Subprocesul.metoda run rulează o listă de argumente. Când se apelează metoda, execută comanda și așteaptă finalizarea procesului, returnând la final un obiect „CompletedProcess”. Obiectul „CompletedProcess” returnează stdout, stderr, argumentele originale utilizate în timpul apelării metodei și un cod de returnare. Stdout se referă la fluxul de date produs de comandă, în timp ce stderr se referă la orice erori ridicate în timpul executării programului. Orice cod de returnare diferit de zero (cod de ieșire) ar însemna eroare la comanda executată în subproces.metoda run.

Exemplul 1: Conținutul rezultatului unui fișier text utilizând subprocesul.rulați Metoda

Comanda de mai jos va afișa conținutul unei „date.txt ”, presupunând că acesta conține un șir„ name = John ”.

subproces de import
subproces.run (["pisică", "date.txt"])

Rularea codului de mai sus va reveni la următoarea ieșire:

nume = John
Proces finalizat (args = ['cat', 'data.txt '], returncode = 0)

Primul element al argumentului listă este numele comenzii de executat. Orice element din listă care urmează primului element sunt considerate opțiuni sau comutatoare din linia de comandă. Puteți utiliza și liniuțe simple și duble, pentru a defini opțiunile. De exemplu, pentru a lista fișiere și foldere într-un director, codul ar fi „subproces.run ([„ls”, „-l”] ”. În majoritatea acestor cazuri, puteți considera orice argument separat de spațiu într-o comandă shell ca un element individual din lista furnizată subprocesului.metoda run.

Exemplul 2: suprimați ieșirea subprocesului.rulați Metoda

Pentru a suprima ieșirea subprocesului.rulați metoda, va trebui să furnizați „stdout = subproces.DEVNULL ”și„ stderr = subproces.DEVNULL ”ca argumente suplimentare.

subproces de import
subproces.run (["pisică", "date.txt "], stdout = subproces.DEVNULL,
stderr = subproces.DEVNULL)

Rularea codului de mai sus va produce următoarea ieșire:

Proces finalizat (args = ['cat', 'data.txt '], returncode = 0)

Exemplul 3: Captarea ieșirii subprocesului.rulați Metoda

Pentru a captura ieșirea subprocesului.rulați metoda, utilizați un argument suplimentar numit „capture_output = True”.

subproces de import
output = subproces.run (["pisică", "date.txt "], capture_output = True)
imprimare (ieșire)

Rularea codului de mai sus va produce următoarea ieșire:

Proces completat (args = ['cat', 'data.txt '], returncode = 0,
stdout = b'name = John \ n ', stderr = b ")

Puteți accesa individual valorile stdout și stderr folosind „output”.stdout ”și„ output.metode stderr ”. Ieșirea este produsă ca o secvență de octeți. Pentru a obține un șir ca ieșire, utilizați „ieșire.stdout.metoda de decodare („utf-8”) ”. De asemenea, puteți furniza „text = True” ca argument suplimentar subprocesului.rulați apelul pentru a obține ieșirea în format șir. Pentru a obține codul de stare de ieșire, puteți utiliza „ieșirea.metoda returncode ”.

Exemplul 4: Creșteți excepția la eșecul comenzii executate de subproces.rulați Metoda

Pentru a ridica o excepție când comanda iese cu o stare diferită de zero, utilizați argumentul „verifică = Adevărat”.

subproces de import
subproces.run (["pisică", "date.tx "], capture_output = True, text = True, check = True)

Rularea codului de mai sus va produce următoarea ieșire:

ridicați CalledProcessError (retcode, proces.argumente,
subproces.CalledProcessError: Comanda '[' cat ',' data.tx ']'
a returnat starea de ieșire diferită de zero 1.

Exemplul 5: Treceți un șir la comandă executat de subproces.rulați Metoda

Puteți trece un șir la comanda care urmează să fie executată prin subproces.rulați metoda folosind argumentul „input = 'string'”.

subproces de import
output = subproces.run (["pisică"], input = "data.txt ", capture_output = True,
text = Adevărat, bifează = Adevărat)
imprimare (ieșire)

Rularea codului de mai sus va produce următoarea ieșire:

Proces finalizat (args = ['cat'], returncode = 0, stdout = "data.txt ", stderr =")

După cum puteți vedea, codul de mai sus transmite „date”.txt ”ca șir și nu ca obiect de fișier. Pentru a transmite „date.txt ”ca fișier, utilizați argumentul„ stdin ”.

cu open ("date.txt ") ca f:
output = subproces.run (["pisică"], stdin = f, capture_output = True,
text = Adevărat, bifează = Adevărat)
imprimare (ieșire)

Rularea codului de mai sus va produce următoarea ieșire:

Proces finalizat (args = ['cat'], returncode = 0, stdout = "nume = John \ n", stderr = ")

Exemplul 6: Executați comanda direct în Shell utilizând subprocesul.rulați Metoda

Este posibil să rulați o comandă direct într-un shell „așa cum este”, în loc să folosiți un șir divizat în comanda principală și opțiunile care o urmează. Pentru a face acest lucru, trebuie să treceți „shell = True” ca argument suplimentar. Cu toate acestea, acest lucru este descurajat de dezvoltatorii de python, deoarece utilizarea „shell = True” poate duce la probleme de securitate. Puteți citi mai multe despre implicațiile de securitate de aici.

subproces de import
subproces.run (date „pisică”.txt '", shell = True)

Rularea codului de mai sus va produce următoarea ieșire:

nume = John

Concluzie

Subprocesul.metoda run în Python este destul de puternică, deoarece vă permite să rulați comenzi shell în propriul python. Acest lucru ajută la limitarea întregului cod la python în sine, fără a fi nevoie să aveți cod de script shell suplimentar în fișiere separate. Cu toate acestea, poate fi destul de dificil să tokenizeze corect comenzile shell dintr-o listă python. Puteți folosi „shlex.metoda split () ”pentru a simboliza comenzile simple ale shell-ului, dar în comenzile lungi și complexe - în special cele cu simboluri pipe - shlex nu reușește să împartă corect comanda. În astfel de cazuri, depanarea poate fi o problemă dificilă. Puteți utiliza argumentul „shell = True” pentru a evita acest lucru, dar există anumite probleme de securitate asociate acestei acțiuni.

How to Install and Play Doom on Linux
Introduction to Doom The Doom Series originated in the 90s after the release of the original Doom. It was an instant hit and from that time onwards th...
Vulkan for Linux Users
With each new generation of graphics cards, we see game developers push the limits of graphical fidelity and come one step closer to photorealism. But...
OpenTTD vs Simutrans
Creating your own transport simulation can be fun, relaxing and extremely enticing. That's why you need to make sure that you try out as many games as...