Kuidas Pythonis väliseid käske käivitada

Kuidas Pythonis väliseid käske käivitada
Kuidas Pythonis väliseid käske käivitada

Pythoni süsteemikäskude käitamine

Python pakub võimsaid võimalusi väliste programmide ja süsteemikäskude täitmiseks otse teie skriptidest. See funktsioon võimaldab teil ära kasutada Pythoni lihtsust, kasutades samal ajal ära teie operatsioonisüsteemis saadaolevaid tohutuid tööriistu.

Ükskõik, kas automatiseerite korduvaid ülesandeid või integreerite keerulisi töövooge, võib Pythonis süsteemikäskude kutsumise mõistmine teie tootlikkust märkimisväärselt tõsta. Selles juhendis uurime erinevaid meetodeid selle tõhusaks saavutamiseks.

Käsk Kirjeldus
subprocess.run Täidab käsu alamkestas. Saab jäädvustada väljundit ja vigu.
subprocess.run([...], capture_output=True) Jäädvustab käivitatud käsu standardväljundi ja standardvea.
subprocess.run([...], shell=True) Käivitab käsu läbi kesta, lubades kesta funktsioone, nagu metamärgid.
subprocess.Popen Täidab käsu uues protsessis, pakkudes suuremat kontrolli selle täitmise üle.
process.stdout.readline() Loeb väljundrea protsessi standardväljundist.
os.system Käivitab käsu alamkestas, mida tavaliselt kasutatakse lihtsa käsu täitmiseks.
subprocess.check_output Käivitab käsu ja tagastab selle väljundi. Tekitab erandi, kui käsk ebaõnnestub.
os.environ.copy() Loob praeguste keskkonnamuutujate koopia, võimaldades muudatusi.
env parameter in subprocess.run Määrab uue protsessi jaoks keskkonnamuutujad.

Skripti täitmise mõistmine Pythonis

Kaasasolevad skriptid näitavad erinevaid viise väliste käskude täitmiseks Pythoni abil. The subprocess.run käsk on mitmekülgne, võimaldades teil käivitada shellikäske otse Pythoni skriptist. Näiteks, subprocess.run(['echo', 'Hello, World!']) prindib konsooli sõnumi, samas subprocess.run(['ls', '-l'], capture_output=True, text=True) lööb väljundi ls -l käsk, mis kuvab üksikasjaliku kataloogiloendi. Kasutades shell=True koos subprocess.run võimaldab kasutada shelli funktsioone, nagu metamärgi laiendamine, muutes selle mugavaks keerukamate käskude jaoks.

The subprocess.Popen käsk annab suurema kontrolli käsu täitmise üle, võimaldades asünkroonse käsu käitamist ja suhtlemist protsessi sisend- ja väljundvoogudega. Näiteks skripti näide koos subprocess.Popen(['ping', 'localhost'], stdout=subprocess.PIPE) pingib pidevalt kohalikku masinat ja loeb iga väljundi rida. Lisaks os.system kasutatakse lihtsa käsu täitmiseks, kuid sellel puudub paindlikkus subprocess. Keskkonnamuutujaid saab muuta ja alamprotsessile edastada kasutades os.environ.copy() ja env parameeter sisse subprocess.run, mis võimaldab keskkonnal põhinevat dünaamilist käskude täitmist.

Väliste käskude täitmine Pythonis

Pythoni alamprotsessimooduli kasutamine

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

Süsteemiülesannete automatiseerimine Pythoniga

os.system ja alamprotsessi moodulite kasutamine

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

Täiustatud tehnikad süsteemikäskude täitmiseks

Teine Pythonis süsteemikäskude täitmise aspekt hõlmab käsu kasutamist shlex moodul shellikäsu sõelumiseks. See moodul võimaldab jagada shellikäsud loendivormingusse, mida saab seejärel edasi anda subprocess funktsioonid. See tagab, et tühikutega argumente käsitletakse õigesti. Lisaks saate kasutada subprocess.PIPE standardsete sisend-, väljund- ja veavoogude suunamiseks põhiprotsessi, võimaldades keerukamat protsessidevahelist suhtlust.

Näiteks käskude aheldamist ja nende väljundi järjestikust töötlemist saab saavutada, ühendades ühe käsu väljundi teise, kasutades subprocess.Popen. See võimaldab teil luua võimsaid käsujadasid, mis on sarnased shelliskriptis tehtavatega. Võite ka kasutada threading mitme alamprotsessikäsu samaaegseks käivitamiseks, suurendades teie skripti tõhusust, eriti kui tegelete I/O-ga seotud ülesannetega.

Korduma kippuvad küsimused Pythonis süsteemikäskude täitmise kohta

  1. Kuidas käivitada shellikäsk ja saada selle väljund Pythonis?
  2. Kasuta subprocess.run koos capture_output=True käsu väljundi hõivamiseks.
  3. Mis on vahet subprocess.run ja subprocess.Popen?
  4. subprocess.run on lihtsam liides, mis ootab käsu täitmist, samas subprocess.Popen annab suurema kontrolli käsu täitmise üle, võimaldades asünkroonset tööd.
  5. Kuidas käsitleda tõrkeid süsteemikäsu käivitamisel?
  6. Kasutage try ja except plokid koos subprocess.CalledProcessError vigade tabamiseks ja käsitlemiseks.
  7. Kas ma saan käsule edastada keskkonnamuutujaid?
  8. Jah, kasuta env parameeter sisse subprocess.run või subprocess.Popen keskkonnamuutujate edastamiseks.
  9. Kuidas käivitada mitu käsku järjest?
  10. Kasuta subprocess.run või subprocess.Popen ahelas või ahelkäsklusi kasutades torusid subprocess.Popen.
  11. Kuidas saan käivitada käsku, mis nõuab kasutaja sisestust?
  12. Kasuta subprocess.Popen koos stdin=subprocess.PIPE ja suhelda protsessiga kasutades process.communicate.
  13. Mis kasu on shlex käsu täitmisel?
  14. shlex aitab shellikäske õigesti sõeluda, tagades tühikutega argumentide õige käsitlemise.
  15. Kuidas taustal käsku käivitada?
  16. Kasutage subprocess.Popen ootamata protsessi lõppu või kasutamata threading tausta täitmise haldamiseks.

Täiustatud tehnikad süsteemikäskude täitmiseks

Teine Pythonis süsteemikäskude täitmise aspekt hõlmab käsu kasutamist shlex moodul shellikäsu sõelumiseks. See moodul võimaldab jagada shellikäsud loendivormingusse, mida saab seejärel edasi anda subprocess funktsioonid. See tagab, et tühikutega argumente käsitletakse õigesti. Lisaks saate kasutada subprocess.PIPE standardsete sisend-, väljund- ja veavoogude suunamiseks põhiprotsessi, võimaldades keerukamat protsessidevahelist suhtlust.

Näiteks käskude aheldamist ja nende väljundi järjestikust töötlemist saab saavutada, ühendades ühe käsu väljundi teise, kasutades subprocess.Popen. See võimaldab teil luua võimsaid käsujadasid, mis on sarnased shelliskriptis tehtavatega. Võite ka kasutada threading mitme alamprotsessikäsu samaaegseks käivitamiseks, suurendades skripti tõhusust, eriti kui tegemist on I/O-ga seotud ülesannetega.

Viimased mõtted Pythonis käskude täitmise kohta

Väliste käskude täitmine Pythonis on mitmekülgne ja võimas võimalus, mis võib teie skriptimis- ja automatiseerimisülesandeid märkimisväärselt täiustada. Kasutades subprocess mooduli abil saate käivitada shellikäske, jäädvustada nende väljundeid ja käsitleda tõhusalt vigu. The os.system funktsioon pakub lihtsamat alternatiivi põhikäskude täitmiseks. Lisaks sisaldab see shlex moodul tagab keerukate shellikäskude korraliku sõelumise. Nende tehnikate mõistmine võimaldab teil ära kasutada Pythoni tugevusi, kasutades samal ajal ära oma operatsioonisüsteemi käsurea tööriistade kogu potentsiaal.