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 importsubproces.run (["pisică", "date.txt"])
Rularea codului de mai sus va reveni la următoarea ieșire:
nume = JohnProces 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 importsubproces.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 importoutput = 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 importsubproces.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 importoutput = 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 importsubproces.run (date „pisică”.txt '", shell = True)
Rularea codului de mai sus va produce următoarea ieșire:
nume = JohnConcluzie
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.