Kaip vykdyti išorines komandas Python

Kaip vykdyti išorines komandas Python
Kaip vykdyti išorines komandas Python

Vykdo sistemos komandas iš Python

Python suteikia galingų galimybių vykdyti išorines programas ir sistemos komandas tiesiai iš jūsų scenarijų. Ši funkcija leidžia išnaudoti „Python“ paprastumą ir tuo pačiu išnaudoti daugybę operacinėje sistemoje esančių įrankių.

Nesvarbu, ar automatizuojate pasikartojančias užduotis, ar integruojate sudėtingas darbo eigas, supratimas, kaip iškviesti sistemos komandas Python, gali žymiai padidinti jūsų produktyvumą. Šiame vadove išnagrinėsime įvairius būdus, kaip tai pasiekti efektyviai.

komandą apibūdinimas
subprocess.run Vykdo komandą subshell. Gali užfiksuoti išvestį ir klaidas.
subprocess.run([...], capture_output=True) Užfiksuoja standartinę vykdomos komandos išvestį ir standartinę klaidą.
subprocess.run([...], shell=True) Vykdo komandą per apvalkalą, leisdamas apvalkalo funkcijas, pvz., pakaitos simbolius.
subprocess.Popen Vykdo komandą naujame procese, suteikdamas daugiau galimybių valdyti jos vykdymą.
process.stdout.readline() Nuskaito išvesties eilutę iš proceso standartinės išvesties.
os.system Vykdo komandą antriniame apvalkale, dažniausiai naudojama paprastam komandų vykdymui.
subprocess.check_output Vykdo komandą ir grąžina jos išvestį. Sukelia išimtį, jei komanda nepavyksta.
os.environ.copy() Sukuria esamų aplinkos kintamųjų kopiją, leidžiančią keisti.
env parameter in subprocess.run Nurodo aplinkos kintamuosius naujam procesui.

Scenarijaus vykdymo supratimas Python

Pateikti scenarijai demonstruoja įvairius išorinių komandų vykdymo būdus naudojant Python. The subprocess.run komanda yra universali, todėl galite paleisti apvalkalo komandas tiesiai iš Python scenarijaus. Pavyzdžiui, subprocess.run(['echo', 'Hello, World!']) spausdina pranešimą į konsolę, o subprocess.run(['ls', '-l'], capture_output=True, text=True) fiksuoja išvestį ls -l komanda, rodanti išsamų katalogų sąrašą. Naudojant shell=True su subprocess.run leidžia naudoti apvalkalo funkcijas, tokias kaip pakaitos simbolių išplėtimas, todėl tai patogu atliekant sudėtingesnes komandas.

The subprocess.Popen komanda leidžia geriau valdyti komandų vykdymą, leisdama vykdyti asinchroninę komandą ir sąveikauti su proceso įvesties ir išvesties srautais. Pavyzdžiui, scenarijaus pavyzdys su subprocess.Popen(['ping', 'localhost'], stdout=subprocess.PIPE) nuolat siunčia ping vietinį įrenginį ir nuskaito kiekvieną išvesties eilutę. Be to, os.system naudojamas paprastam komandų vykdymui, tačiau jam trūksta lankstumo subprocess. Aplinkos kintamieji gali būti modifikuojami ir perduodami subprocesui naudojant os.environ.copy() ir env parametras in subprocess.run, leidžiantis dinamiškai vykdyti komandas pagal aplinką.

Išorinių komandų vykdymas Python

Naudojant Python subprocesų modulį

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())

Sistemos užduočių automatizavimas naudojant Python

Naudojant os.system ir subprocesų modulius

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())

Pažangios sistemos komandų vykdymo technologijos

Kitas sistemos komandų vykdymo Python aspektas apima naudojimą shlex modulis, skirtas apdoroti apvalkalo komandų analizę. Šis modulis suteikia galimybę padalyti apvalkalo komandas į sąrašo formatą, kurį vėliau galima perduoti subprocess funkcijas. Tai užtikrina, kad argumentai su tarpais yra tvarkomi teisingai. Be to, galite naudoti subprocess.PIPE nukreipti standartinius įvesties, išvesties ir klaidų srautus į pirminį procesą, kad būtų galima atlikti sudėtingesnį procesų ryšį.

Pavyzdžiui, komandų sujungimas ir nuoseklus jų išvesties apdorojimas gali būti pasiektas sujungiant vienos komandos išvestį į kitą naudojant subprocess.Popen. Tai leidžia sukurti galingas komandų sekas, panašias į tai, ką darytumėte apvalkalo scenarijuje. Taip pat galite naudoti threading vienu metu paleisti kelias subprocesų komandas, padidinant scenarijaus efektyvumą, ypač kai dirbama su įvesties / išvesties užduotimis.

Dažnai užduodami klausimai apie sistemos komandų vykdymą Python

  1. Kaip paleisti apvalkalo komandą ir gauti jos išvestį Python?
  2. Naudokite subprocess.run su capture_output=True kad užfiksuotumėte komandos išvestį.
  3. Koks skirtumas tarp subprocess.run ir subprocess.Popen?
  4. subprocess.run yra paprastesnė sąsaja, kuri laukia, kol komanda bus baigta subprocess.Popen suteikia daugiau galimybių valdyti komandų vykdymą, leidžiantį veikti asinchroniškai.
  5. Kaip tvarkyti klaidas vykdant sistemos komandą?
  6. Naudokite try ir except blokai su subprocess.CalledProcessError pagauti ir valdyti klaidas.
  7. Ar galiu komandai perduoti aplinkos kintamuosius?
  8. Taip, naudokite env parametras in subprocess.run arba subprocess.Popen perduoti aplinkos kintamuosius.
  9. Kaip paleisti kelias komandas iš eilės?
  10. Naudokite subprocess.run arba subprocess.Popen kilpoje arba grandinėje komandos naudojant vamzdžius su subprocess.Popen.
  11. Kaip galiu vykdyti komandą, kuriai reikia vartotojo įvesties?
  12. Naudokite subprocess.Popen su stdin=subprocess.PIPE ir bendrauti su procesu naudojant process.communicate.
  13. Kokia nauda iš shlex vykdant komandą?
  14. shlex padeda teisingai išanalizuoti apvalkalo komandas, užtikrinant, kad argumentai su tarpais būtų tinkamai tvarkomi.
  15. Kaip paleisti komandą fone?
  16. Naudokite subprocess.Popen nelaukiant, kol procesas bus baigtas, arba naudoti threading valdyti foninį vykdymą.

Pažangios sistemos komandų vykdymo technologijos

Kitas sistemos komandų vykdymo Python aspektas apima naudojimą shlex modulis, skirtas apdoroti apvalkalo komandų analizę. Šis modulis suteikia galimybę padalyti apvalkalo komandas į sąrašo formatą, kurį vėliau galima perduoti subprocess funkcijas. Tai užtikrina, kad argumentai su tarpais yra tvarkomi teisingai. Be to, galite naudoti subprocess.PIPE nukreipti standartinius įvesties, išvesties ir klaidų srautus į pirminį procesą, kad būtų galima atlikti sudėtingesnį procesų ryšį.

Pavyzdžiui, komandų sujungimas ir nuoseklus jų išvesties apdorojimas gali būti pasiektas sujungiant vienos komandos išvestį į kitą naudojant subprocess.Popen. Tai leidžia sukurti galingas komandų sekas, panašias į tai, ką darytumėte apvalkalo scenarijuje. Taip pat galite naudoti threading vienu metu paleisti kelias subprocesų komandas, padidinant scenarijaus efektyvumą, ypač kai dirbama su įvesties / išvesties užduotimis.

Paskutinės mintys apie komandų vykdymą Python

Išorinių komandų vykdymas „Python“ yra universali ir galinga galimybė, galinti žymiai pagerinti scenarijų kūrimo ir automatizavimo užduotis. Naudodami subprocess modulį, galite paleisti apvalkalo komandas, užfiksuoti jų išvestis ir efektyviai tvarkyti klaidas. The os.system funkcija suteikia paprastesnę alternatyvą pagrindinėms komandoms vykdyti. Be to, įtraukiant shlex modulis užtikrina tinkamą sudėtingų apvalkalo komandų analizavimą. Suprasdami šiuos metodus galėsite panaudoti Python pranašumus ir išnaudoti visas operacinės sistemos komandų eilutės įrankių galimybes.