Kako izvajati zunanje ukaze v Pythonu

Kako izvajati zunanje ukaze v Pythonu
Kako izvajati zunanje ukaze v Pythonu

Izvajanje sistemskih ukazov iz Pythona

Python ponuja zmogljive zmogljivosti za izvajanje zunanjih programov in sistemskih ukazov neposredno iz vaših skriptov. Ta funkcija vam omogoča, da izkoristite preprostost Pythona, hkrati pa izkoristite široko paleto orodij, ki so na voljo v vašem operacijskem sistemu.

Ne glede na to, ali avtomatizirate ponavljajoče se naloge ali integrirate zapletene poteke dela, lahko razumevanje, kako kličete sistemske ukaze v Pythonu, znatno poveča vašo produktivnost. V tem priročniku bomo raziskali različne metode, kako to učinkovito doseči.

Ukaz Opis
subprocess.run Izvede ukaz v podlupini. Lahko zajame izpis in napake.
subprocess.run([...], capture_output=True) Zajame standardni izhod in standardno napako izvedenega ukaza.
subprocess.run([...], shell=True) Zažene ukaz skozi ukazno lupino in omogoči funkcije lupine, kot so nadomestni znaki.
subprocess.Popen Izvede ukaz v novem procesu, kar zagotavlja večji nadzor nad njegovim izvajanjem.
process.stdout.readline() Prebere vrstico izhoda iz standardnega izhoda procesa.
os.system Izvede ukaz v podlupini, ki se običajno uporablja za preprosto izvajanje ukazov.
subprocess.check_output Zažene ukaz in vrne njegov rezultat. Sproži izjemo, če ukaz ne uspe.
os.environ.copy() Ustvari kopijo trenutnih spremenljivk okolja, kar omogoča spremembe.
env parameter in subprocess.run Podaja spremenljivke okolja za nov proces.

Razumevanje izvajanja skripta v Pythonu

Priloženi skripti prikazujejo različne načine izvajanja zunanjih ukazov z uporabo Pythona. The subprocess.run ukaz je vsestranski in vam omogoča zagon lupinskih ukazov neposredno iz vašega skripta Python. Na primer, subprocess.run(['echo', 'Hello, World!']) natisne sporočilo na konzolo, medtem ko subprocess.run(['ls', '-l'], capture_output=True, text=True) zajame rezultat ls -l ukaz, ki prikaže podroben seznam imenikov. Uporaba shell=True z subprocess.run omogoča uporabo funkcij lupine, kot je razširitev nadomestnih znakov, zaradi česar je priročen za bolj zapletene ukaze.

The subprocess.Popen zagotavlja več nadzora nad izvajanjem ukazov, saj omogoča izvajanje asinhronih ukazov in interakcijo z vhodnimi in izhodnimi tokovi procesa. Na primer, primer scenarija z subprocess.Popen(['ping', 'localhost'], stdout=subprocess.PIPE) nenehno pinga lokalni stroj in bere vsako vrstico izhoda. Poleg tega os.system se uporablja za preprosto izvajanje ukazov, vendar nima prilagodljivosti subprocess. Spremenljivke okolja je mogoče spremeniti in posredovati podprocesu z uporabo os.environ.copy() in env parameter v subprocess.run, ki omogoča dinamično izvajanje ukazov glede na okolje.

Izvajanje zunanjih ukazov v Pythonu

Uporaba Pythonovega podprocesnega modula

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

Avtomatizacija sistemskih nalog s Pythonom

Uporaba os.system in podprocesnih modulov

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

Napredne tehnike za izvajanje sistemskih ukazov

Drug vidik izvajanja sistemskih ukazov v Pythonu vključuje uporabo shlex modul za razčlenjevanje ukazov lupine. Ta modul ponuja način za razdelitev ukazov lupine v obliko seznama, ki se mu lahko nato posreduje subprocess funkcije. To zagotavlja pravilno obravnavo argumentov s presledki. Poleg tega lahko uporabite subprocess.PIPE za usmerjanje standardnih vhodnih, izhodnih in tokov napak v nadrejeni proces, kar omogoča bolj zapleteno komunikacijo med procesi.

Na primer, veriženje ukazov in zaporedno obdelavo njihovega izhoda je mogoče doseči s cevovodom izhoda enega ukaza v drugega z uporabo subprocess.Popen. To vam omogoča, da ustvarite zmogljiva zaporedja ukazov, podobna tistim, ki bi jih naredili v lupinskem skriptu. Uporabite lahko tudi threading za hkratno izvajanje več ukazov podprocesa, s čimer povečate učinkovitost vašega skripta, še posebej pri opravilih, povezanih z V/I.

Pogosto zastavljena vprašanja o izvajanju sistemskih ukazov v Pythonu

  1. Kako lahko zaženem lupinski ukaz in dobim njegov izhod v Pythonu?
  2. Uporaba subprocess.run z capture_output=True za zajem izhoda ukaza.
  3. Kaj je razlika med subprocess.run in subprocess.Popen?
  4. subprocess.run je enostavnejši vmesnik, ki čaka na dokončanje ukaza, medtem ko subprocess.Popen daje večji nadzor nad izvajanjem ukazov, kar omogoča asinhrono delovanje.
  5. Kako obravnavam napake pri izvajanju sistemskega ukaza?
  6. Uporaba try in except bloki z subprocess.CalledProcessError za odkrivanje in obravnavanje napak.
  7. Ali lahko ukazu posredujem spremenljivke okolja?
  8. Da, uporabite env parameter v subprocess.run oz subprocess.Popen za posredovanje spremenljivk okolja.
  9. Kako zaženem več ukazov zaporedoma?
  10. Uporaba subprocess.run oz subprocess.Popen v zanki ali verižnih ukazih z uporabo cevi s subprocess.Popen.
  11. Kako lahko izvedem ukaz, ki zahteva uporabniški vnos?
  12. Uporaba subprocess.Popen z stdin=subprocess.PIPE in komunicirati s procesom z uporabo process.communicate.
  13. Kakšna je uporaba shlex pri izvajanju ukaza?
  14. shlex pomaga pri pravilnem razčlenjevanju ukazov ukazne lupine in zagotavlja pravilno obravnavo argumentov s presledki.
  15. Kako zaženem ukaz v ozadju?
  16. Uporaba subprocess.Popen brez čakanja na dokončanje postopka ali uporabe threading za upravljanje izvajanja v ozadju.

Napredne tehnike za izvajanje sistemskih ukazov

Drug vidik izvajanja sistemskih ukazov v Pythonu vključuje uporabo shlex modul za razčlenjevanje ukazov lupine. Ta modul ponuja način za razdelitev ukazov lupine v obliko seznama, ki mu je nato mogoče posredovati subprocess funkcije. To zagotavlja, da se argumenti s presledki pravilno obravnavajo. Poleg tega lahko uporabite subprocess.PIPE za usmerjanje standardnih vhodnih, izhodnih in tokov napak v nadrejeni proces, kar omogoča bolj zapleteno komunikacijo med procesi.

Na primer, veriženje ukazov in zaporedno obdelavo njihovega izhoda je mogoče doseči s cevovodom izhoda enega ukaza v drugega z uporabo subprocess.Popen. To vam omogoča, da ustvarite zmogljiva zaporedja ukazov, podobna tistim, ki bi jih naredili v lupinskem skriptu. Uporabite lahko tudi threading za hkratno izvajanje več ukazov podprocesov, s čimer povečate učinkovitost vašega skripta, še posebej pri opravilih, povezanih z V/I.

Končne misli o izvajanju ukazov v Pythonu

Izvajanje zunanjih ukazov v Pythonu je vsestranska in zmogljiva zmožnost, ki lahko bistveno izboljša vaše naloge skriptiranja in avtomatizacije. Z uporabo subprocess modul, lahko izvajate lupinske ukaze, zajemate njihove rezultate in učinkovito obravnavate napake. The os.system ponuja preprostejšo alternativo za osnovno izvajanje ukazov. Poleg tega vključuje shlex modul zagotavlja pravilno razčlenjevanje kompleksnih ukazov lupine. Razumevanje teh tehnik vam omogoča, da izkoristite prednosti Pythona, hkrati pa izkoristite ves potencial orodij ukazne vrstice vašega operacijskega sistema.