Cum să executați comenzi externe în Python

Python subprocess

Rularea comenzilor de sistem din Python

Python oferă capabilități puternice pentru a executa programe externe și comenzi de sistem direct din scripturile dvs. Această caracteristică vă permite să profitați de simplitatea lui Python, profitând în același timp de gama largă de instrumente disponibile în sistemul dvs. de operare.

Indiferent dacă automatizați sarcini repetitive sau integrați fluxuri de lucru complexe, înțelegerea modului de apelare a comenzilor de sistem în Python vă poate îmbunătăți semnificativ productivitatea. În acest ghid, vom explora diferite metode pentru a realiza acest lucru în mod eficient.

Comanda Descriere
subprocess.run Execută o comandă într-un subshell. Poate capta rezultate și erori.
subprocess.run([...], capture_output=True) Captează ieșirea standard și eroarea standard a comenzii executate.
subprocess.run([...], shell=True) Rulează comanda prin shell, permițând caracteristici shell, cum ar fi metacaracterele.
subprocess.Popen Execută o comandă într-un proces nou, oferind mai mult control asupra execuției sale.
process.stdout.readline() Citește o linie de ieșire din ieșirea standard a procesului.
os.system Execută o comandă într-un subshell, folosit în mod obișnuit pentru execuția simplă a comenzii.
subprocess.check_output Rulează o comandă și returnează rezultatul acesteia. Ridică o excepție dacă comanda eșuează.
os.environ.copy() Creează o copie a variabilelor de mediu curente, permițând modificări.
env parameter in subprocess.run Specifică variabilele de mediu pentru noul proces.

Înțelegerea execuției scriptului în Python

Scripturile furnizate demonstrează diferite moduri de a executa comenzi externe folosind Python. The comanda este versatilă, permițându-vă să rulați comenzi shell direct din scriptul dvs. Python. De exemplu, imprimă un mesaj pe consolă, în timp ce captează rezultatul ls -l comandă, afișând o listă detaliată a directorului. Folosind cu permite utilizarea caracteristicilor shell, cum ar fi extinderea wildcard, făcându-l la îndemână pentru comenzi mai complexe.

The comanda oferă mai mult control asupra execuției comenzilor, permițând rularea asincronă a comenzii și interacțiunea cu fluxurile de intrare și ieșire ale procesului. De exemplu, exemplul de script cu dă ping continuu la mașina locală și citește fiecare linie de ieșire. În plus, este folosit pentru executarea simplă a comenzii, dar îi lipsește flexibilitatea subprocess. Variabilele de mediu pot fi modificate și transmise subprocesului folosind si parametrul in , permițând executarea dinamică a comenzii în funcție de mediu.

Executarea comenzilor externe în Python

Folosind modulul de subproces al lui Python

import subprocess
# Example 1: Running a simple shell command
subprocess.run(['echo', 'Hello, World!'])
# Example 2: Capturing the output of a command
result = subprocess.run(['ls', '-l'], capture_output=True, text=True)
print(result.stdout)
# Example 3: Running a command with shell=True
subprocess.run('echo Hello from the shell', shell=True)
# Example 4: Checking the return code
result = subprocess.run(['ls', 'nonexistentfile'], capture_output=True)
if result.returncode != 0:
    print('Command failed')
# Example 5: Using subprocess.Popen for more control
process = subprocess.Popen(['ping', 'localhost'], stdout=subprocess.PIPE)
while True:
    output = process.stdout.readline()
    if output == b'' and process.poll() is not None:
        break
    if output:
        print(output.strip().decode())

Automatizarea sarcinilor sistemului cu Python

Utilizarea modulelor os.system și subproces

import os
import subprocess
# Example 1: Using os.system to run a command
os.system('echo This is a test')
# Example 2: Running a command and capturing output with subprocess
result = subprocess.run(['date'], capture_output=True, text=True)
print('Current date and time:', result.stdout)
# Example 3: Executing multiple commands
commands = ['echo First command', 'echo Second command']
for cmd in commands:
    os.system(cmd)
# Example 4: Running a command with environment variables
env = os.environ.copy()
env['MY_VAR'] = 'Hello'
subprocess.run('echo $MY_VAR', shell=True, env=env)
# Example 5: Handling command errors
try:
    subprocess.check_output(['false_command'], stderr=subprocess.STDOUT)
except subprocess.CalledProcessError as e:
    print('An error occurred:', e.output.decode())

Tehnici avansate pentru executarea comenzilor sistemului

Un alt aspect al executării comenzilor de sistem în Python implică utilizarea modul pentru a gestiona analiza comenzilor shell. Acest modul oferă o modalitate de a împărți comenzile shell într-un format de listă, care poate fi apoi transmisă funcții. Acest lucru asigură că argumentele cu spații sunt tratate corect. În plus, puteți utiliza pentru a direcționa fluxurile standard de intrare, ieșire și eroare către procesul părinte, permițând o comunicare mai complexă între procese.

De exemplu, înlănțuirea comenzilor și procesarea secvențială a ieșirii acestora poate fi realizată prin conectarea ieșirii unei comenzi în alta folosind . Acest lucru vă permite să creați secvențe de comenzi puternice similare cu ceea ce ați face într-un script shell. De asemenea, puteți utiliza pentru a rula mai multe comenzi de subprocese simultan, sporind eficiența scriptului, mai ales atunci când aveți de-a face cu sarcini legate de I/O.

  1. Cum pot rula o comandă shell și obține rezultatul acesteia în Python?
  2. Utilizare cu pentru a captura rezultatul comenzii.
  3. Care e diferenta dintre și ?
  4. este o interfață mai simplă care așteaptă finalizarea comenzii, în timp ce oferă mai mult control asupra execuției comenzii, permițând operarea asincronă.
  5. Cum gestionez erorile când rulez o comandă de sistem?
  6. Utilizare și blocuri cu pentru a surprinde și gestiona erorile.
  7. Pot transmite variabile de mediu unei comenzi?
  8. Da, folosește parametrul in sau pentru a trece variabilele de mediu.
  9. Cum rulez mai multe comenzi în secvență?
  10. Utilizare sau într-o buclă sau în lanț comenzi folosind conducte cu .
  11. Cum pot executa o comandă care necesită intrarea utilizatorului?
  12. Utilizare cu și să comunice cu procesul utilizând .
  13. La ce folosește în executarea comenzii?
  14. ajută la analizarea corectă a comenzilor shell, asigurându-se că argumentele cu spații sunt gestionate corect.
  15. Cum rulez o comandă în fundal?
  16. Utilizare fără a aștepta finalizarea procesului sau utilizarea pentru a gestiona execuția în fundal.

Tehnici avansate pentru executarea comenzilor sistemului

Un alt aspect al executării comenzilor de sistem în Python implică utilizarea modul pentru a gestiona analiza comenzilor shell. Acest modul oferă o modalitate de a împărți comenzile shell într-un format de listă, care poate fi apoi transmisă funcții. Acest lucru asigură că argumentele cu spații sunt tratate corect. În plus, puteți utiliza pentru a direcționa fluxurile standard de intrare, ieșire și eroare către procesul părinte, permițând o comunicare mai complexă între procese.

De exemplu, înlănțuirea comenzilor și procesarea secvențială a ieșirii acestora poate fi realizată prin conectarea ieșirii unei comenzi în alta folosind . Acest lucru vă permite să creați secvențe de comenzi puternice similare cu ceea ce ați face într-un script shell. De asemenea, puteți utiliza pentru a rula mai multe comenzi de subprocese simultan, sporind eficiența scriptului, mai ales atunci când aveți de-a face cu sarcini legate de I/O.

Executarea comenzilor externe în Python este o capacitate versatilă și puternică care vă poate îmbunătăți semnificativ sarcinile de scriptare și automatizare. Prin utilizarea modul, puteți rula comenzi shell, puteți captura rezultatele acestora și puteți gestiona erorile în mod eficient. The funcția oferă o alternativă mai simplă pentru executarea comenzilor de bază. În plus, încorporând modulul asigură analiza corectă a comenzilor shell complexe. Înțelegerea acestor tehnici vă permite să valorificați punctele forte ale Python, utilizând în același timp întregul potențial al instrumentelor din linia de comandă ale sistemului dvs. de operare.