Kā izpildīt ārējās komandas Python

Kā izpildīt ārējās komandas Python
Kā izpildīt ārējās komandas Python

Sistēmas komandu palaišana no Python

Python nodrošina jaudīgas iespējas ārēju programmu un sistēmas komandu izpildei tieši no jūsu skriptiem. Šī funkcija ļauj izmantot Python vienkāršību, vienlaikus izmantojot jūsu operētājsistēmā pieejamo rīku plašo klāstu.

Neatkarīgi no tā, vai automatizējat atkārtotus uzdevumus vai integrējat sarežģītas darbplūsmas, izpratne par to, kā Python izsaukt sistēmas komandas, var ievērojami uzlabot jūsu produktivitāti. Šajā rokasgrāmatā mēs izpētīsim dažādas metodes, kā to efektīvi sasniegt.

Pavēli Apraksts
subprocess.run Izpilda komandu apakščaulā. Var uztvert izvadi un kļūdas.
subprocess.run([...], capture_output=True) Uztver izpildītās komandas standarta izvadi un standarta kļūdu.
subprocess.run([...], shell=True) Palaiž komandu čaulā, ļaujot čaulas līdzekļus, piemēram, aizstājējzīmes.
subprocess.Popen Izpilda komandu jaunā procesā, nodrošinot lielāku kontroli pār tās izpildi.
process.stdout.readline() Nolasa izvades rindu no procesa standarta izvades.
os.system Izpilda komandu apakšapvalkā, ko parasti izmanto vienkāršai komandu izpildei.
subprocess.check_output Palaiž komandu un atgriež tās izvadi. Rada izņēmumu, ja komanda neizdodas.
os.environ.copy() Izveido pašreizējo vides mainīgo kopiju, ļaujot veikt modifikācijas.
env parameter in subprocess.run Norāda vides mainīgos jaunajam procesam.

Izpratne par skripta izpildi Python

Piedāvātie skripti parāda dažādus veidus, kā izpildīt ārējās komandas, izmantojot Python. The subprocess.run komanda ir daudzpusīga, ļaujot palaist čaulas komandas tieši no Python skripta. Piemēram, subprocess.run(['echo', 'Hello, World!']) izdrukā ziņojumu konsolei, kamēr subprocess.run(['ls', '-l'], capture_output=True, text=True) tver izvadi ls -l komandu, parādot detalizētu direktoriju sarakstu. Izmantojot shell=True ar subprocess.run ļauj izmantot čaulas līdzekļus, piemēram, aizstājējzīmju paplašināšanu, padarot to parocīgu sarežģītākām komandām.

The subprocess.Popen komanda nodrošina lielāku kontroli pār komandu izpildi, ļaujot asinhroni darboties un mijiedarboties ar procesa ievades un izvades straumēm. Piemēram, skripta piemērs ar subprocess.Popen(['ping', 'localhost'], stdout=subprocess.PIPE) nepārtraukti nosūta ping vietējai mašīnai un nolasa katru izvades rindiņu. Turklāt os.system tiek izmantota vienkāršai komandu izpildei, taču tai trūkst elastības subprocess. Vides mainīgos var modificēt un nodot apakšprocesam, izmantojot os.environ.copy() un env parametrs iekšā subprocess.run, kas ļauj dinamiski izpildīt komandas, pamatojoties uz vidi.

Ārējo komandu izpilde programmā Python

Izmantojot Python apakšprocesa moduli

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

Sistēmas uzdevumu automatizācija, izmantojot Python

Izmantojot os.system un apakšprocesu moduļus

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

Uzlabotas metodes sistēmas komandu izpildei

Vēl viens sistēmas komandu izpildes aspekts Python ietver izmantošanu shlex modulis, lai apstrādātu čaulas komandu parsēšanu. Šis modulis nodrošina veidu, kā sadalīt čaulas komandas saraksta formātā, ko pēc tam var nodot subprocess funkcijas. Tas nodrošina, ka argumenti ar atstarpēm tiek apstrādāti pareizi. Turklāt jūs varat izmantot subprocess.PIPE lai novirzītu standarta ievades, izvades un kļūdu straumes uz vecāku procesu, ļaujot veikt sarežģītāku starpprocesu saziņu.

Piemēram, komandu ķēdes apstrādi un to izvades secīgu apstrādi var panākt, savienojot vienas komandas izvadi citā, izmantojot subprocess.Popen. Tas ļauj izveidot spēcīgas komandu secības, kas ir līdzīgas tam, ko jūs darītu čaulas skriptā. Varat arī izmantot threading lai vienlaikus palaistu vairākas apakšprocesa komandas, uzlabojot skripta efektivitāti, it īpaši, veicot I/O uzdevumus.

Bieži uzdotie jautājumi par sistēmas komandu izpildi Python

  1. Kā es varu palaist čaulas komandu un iegūt tās izvadi programmā Python?
  2. Izmantot subprocess.run ar capture_output=True lai uztvertu komandas izvadi.
  3. Kāda ir atšķirība starp subprocess.run un subprocess.Popen?
  4. subprocess.run ir vienkāršāks interfeiss, kas gaida, līdz komanda tiks pabeigta, kamēr subprocess.Popen nodrošina lielāku kontroli pār komandu izpildi, ļaujot asinhroni darboties.
  5. Kā rīkoties ar kļūdām, palaižot sistēmas komandu?
  6. Izmantot try un except bloki ar subprocess.CalledProcessError lai uztvertu un apstrādātu kļūdas.
  7. Vai es varu nodot vides mainīgos komandai?
  8. Jā, izmantojiet env parametrs iekšā subprocess.run vai subprocess.Popen lai nodotu vides mainīgos.
  9. Kā pēc kārtas palaist vairākas komandas?
  10. Izmantot subprocess.run vai subprocess.Popen cilpā vai ķēdē komandas, izmantojot caurules ar subprocess.Popen.
  11. Kā es varu izpildīt komandu, kurai nepieciešama lietotāja ievade?
  12. Izmantot subprocess.Popen ar stdin=subprocess.PIPE un sazināties ar procesu, izmantojot process.communicate.
  13. Kāda ir izmantošana shlex komandas izpildē?
  14. shlex palīdz pareizi parsēt čaulas komandas, nodrošinot, ka argumenti ar atstarpēm tiek pareizi apstrādāti.
  15. Kā es varu palaist komandu fonā?
  16. Izmantot subprocess.Popen negaidot procesa pabeigšanu vai izmantošanu threading lai pārvaldītu fona izpildi.

Uzlabotas metodes sistēmas komandu izpildei

Vēl viens sistēmas komandu izpildes aspekts Python ietver izmantošanu shlex modulis, lai apstrādātu čaulas komandu parsēšanu. Šis modulis nodrošina veidu, kā sadalīt čaulas komandas saraksta formātā, ko pēc tam var nodot subprocess funkcijas. Tas nodrošina, ka argumenti ar atstarpēm tiek apstrādāti pareizi. Turklāt jūs varat izmantot subprocess.PIPE lai novirzītu standarta ievades, izvades un kļūdu straumes uz vecāku procesu, ļaujot veikt sarežģītāku starpprocesu saziņu.

Piemēram, komandu ķēdes ķēdi un to izvades secīgu apstrādi var panākt, savienojot vienas komandas izvadi citā, izmantojot subprocess.Popen. Tas ļauj izveidot spēcīgas komandu secības, kas ir līdzīgas tam, ko jūs darītu čaulas skriptā. Varat arī izmantot threading lai vienlaikus palaistu vairākas apakšprocesa komandas, uzlabojot skripta efektivitāti, it īpaši, veicot I/O uzdevumus.

Pēdējās domas par komandu izpildi Python

Ārējo komandu izpilde programmā Python ir daudzpusīga un jaudīga iespēja, kas var ievērojami uzlabot jūsu skriptēšanas un automatizācijas uzdevumus. Izmantojot subprocess moduli, varat palaist čaulas komandas, tvert to rezultātus un efektīvi apstrādāt kļūdas. The os.system funkcija nodrošina vienkāršāku alternatīvu pamata komandu izpildei. Turklāt, iekļaujot shlex modulis nodrošina pareizu sarežģītu čaulas komandu parsēšanu. Izprotot šīs metodes, varat izmantot Python stiprās puses, vienlaikus izmantojot visu operētājsistēmas komandrindas rīku potenciālu.