Kjører systemkommandoer fra Python
Python gir kraftige funksjoner for å utføre eksterne programmer og systemkommandoer direkte fra skriptene dine. Denne funksjonen lar deg utnytte Pythons enkelhet mens du drar nytte av det store utvalget av verktøy som er tilgjengelige i operativsystemet ditt.
Enten du automatiserer repeterende oppgaver eller integrerer komplekse arbeidsflyter, kan det å forstå hvordan du kaller systemkommandoer i Python forbedre produktiviteten din betraktelig. I denne veiledningen vil vi utforske ulike metoder for å oppnå dette effektivt.
Kommando | Beskrivelse |
---|---|
subprocess.run | Utfører en kommando i et underskall. Kan fange opp utdata og feil. |
subprocess.run([...], capture_output=True) | Fanger standardutdata og standardfeil for den utførte kommandoen. |
subprocess.run([...], shell=True) | Kjører kommandoen gjennom skallet, og tillater skallfunksjoner som jokertegn. |
subprocess.Popen | Utfører en kommando i en ny prosess, og gir mer kontroll over utførelsen. |
process.stdout.readline() | Leser en utdatalinje fra prosessens standardutgang. |
os.system | Utfører en kommando i et underskall, vanligvis brukt for enkel kommandoutførelse. |
subprocess.check_output | Kjører en kommando og returnerer utdata. Oppretter et unntak hvis kommandoen mislykkes. |
os.environ.copy() | Oppretter en kopi av gjeldende miljøvariabler, og tillater endringer. |
env parameter in subprocess.run | Spesifiserer miljøvariabler for den nye prosessen. |
Forstå skriptutførelse i Python
Skriptene som leveres demonstrerer ulike måter å utføre eksterne kommandoer ved hjelp av Python. De subprocess.run kommandoen er allsidig, slik at du kan kjøre skallkommandoer direkte fra Python-skriptet ditt. For eksempel, subprocess.run(['echo', 'Hello, World!']) skriver ut en melding til konsollen, mens subprocess.run(['ls', '-l'], capture_output=True, text=True) fanger opp resultatet av ls -l kommando, viser en detaljert katalogoppføring. Ved hjelp av shell=True med subprocess.run tillater bruk av skallfunksjoner, som utvidelse av jokertegn, noe som gjør det nyttig for mer komplekse kommandoer.
De subprocess.Popen kommando gir mer kontroll over kommandoutførelse ved å tillate asynkron kommandokjøring og interaksjon med prosessens inngangs- og utdatastrømmer. For eksempel skripteksemplet med subprocess.Popen(['ping', 'localhost'], stdout=subprocess.PIPE) pinger kontinuerlig den lokale maskinen og leser hver utdatalinje. I tillegg, os.system brukes til enkel kommandoutførelse, men mangler fleksibiliteten til subprocess. Miljøvariabler kan endres og sendes til underprosessen ved hjelp av os.environ.copy() og env parameter i subprocess.run, som tillater dynamisk kommandoutførelse basert på miljøet.
Utføre eksterne kommandoer i Python
Bruker Pythons delprosessmodul
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())
Automatisering av systemoppgaver med Python
Bruk av os.system og delprosessmoduler
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())
Avanserte teknikker for utførelse av systemkommandoer
Et annet aspekt ved å utføre systemkommandoer i Python involverer bruk av 1. 3 modul for å håndtere shell-kommando-parsing. Denne modulen gir en måte å dele skallkommandoer i et listeformat, som deretter kan sendes til subprocess funksjoner. Dette sikrer at argumenter med mellomrom håndteres riktig. I tillegg kan du bruke subprocess.PIPE å dirigere standard input, output og feilstrømmer til den overordnede prosessen, noe som muliggjør mer kompleks kommunikasjon mellom prosesser.
For eksempel kan kjede kommandoer og behandle utdataene deres sekvensielt ved å overføre utdataene fra en kommando til en annen ved å bruke subprocess.Popen. Dette lar deg lage kraftige kommandosekvenser som ligner på det du ville gjort i et skallskript. Du kan også bruke threading å kjøre flere underprosesskommandoer samtidig, noe som øker effektiviteten til skriptet ditt, spesielt når du arbeider med I/O-bundne oppgaver.
Ofte stilte spørsmål om utføring av systemkommandoer i Python
- Hvordan kan jeg kjøre en shell-kommando og få utdata i Python?
- Bruk subprocess.run med capture_output=True for å fange kommandoens utdata.
- Hva er forskjellen mellom subprocess.run og subprocess.Popen?
- subprocess.run er et enklere grensesnitt som venter på at kommandoen skal fullføres, mens subprocess.Popen gir mer kontroll over kommandoutførelsen, og tillater asynkron drift.
- Hvordan håndterer jeg feil når jeg kjører en systemkommando?
- Bruk try og except blokker med subprocess.CalledProcessError å fange opp og håndtere feil.
- Kan jeg sende miljøvariabler til en kommando?
- Ja, bruk env parameter i subprocess.run eller subprocess.Popen å sende miljøvariabler.
- Hvordan kjører jeg flere kommandoer i rekkefølge?
- Bruk subprocess.run eller subprocess.Popen i en sløyfe eller kjede kommandoer ved hjelp av rør med subprocess.Popen.
- Hvordan kan jeg utføre en kommando som krever brukerinndata?
- Bruk subprocess.Popen med stdin=subprocess.PIPE og kommunisere med prosessen ved hjelp av process.communicate.
- Hva er bruken av 1. 3 i kommandoutførelse?
- 1. 3 hjelper til med å analysere skallkommandoer riktig, og sikrer at argumenter med mellomrom håndteres riktig.
- Hvordan kjører jeg en kommando i bakgrunnen?
- Bruk subprocess.Popen uten å vente på at prosessen skal fullføres eller brukes threading for å administrere bakgrunnskjøring.
Avanserte teknikker for utførelse av systemkommandoer
Et annet aspekt ved å utføre systemkommandoer i Python involverer bruk av 1. 3 modul for å håndtere shell-kommando-parsing. Denne modulen gir en måte å dele skallkommandoer i et listeformat, som deretter kan sendes til subprocess funksjoner. Dette sikrer at argumenter med mellomrom håndteres riktig. I tillegg kan du bruke subprocess.PIPE å dirigere standard input, output og feilstrømmer til den overordnede prosessen, noe som muliggjør mer kompleks kommunikasjon mellom prosesser.
For eksempel kan kjede kommandoer og behandle utdataene deres sekvensielt ved å overføre utdataene fra en kommando til en annen ved å bruke subprocess.Popen. Dette lar deg lage kraftige kommandosekvenser som ligner på det du ville gjort i et skallskript. Du kan også bruke threading å kjøre flere underprosesskommandoer samtidig, noe som øker effektiviteten til skriptet ditt, spesielt når du arbeider med I/O-bundne oppgaver.
Siste tanker om å utføre kommandoer i Python
Å utføre eksterne kommandoer i Python er en allsidig og kraftig funksjon som kan forbedre skript- og automatiseringsoppgavene dine betydelig. Ved å bruke subprocess modul, kan du kjøre skallkommandoer, fange opp utdataene deres og håndtere feil effektivt. De os.system funksjonen gir et enklere alternativ for grunnleggende kommandoutførelse. I tillegg innlemmer 1. 3 modulen sikrer riktig analyse av komplekse skallkommandoer. Å forstå disse teknikkene gjør at du kan utnytte Pythons styrker mens du utnytter det fulle potensialet til operativsystemets kommandolinjeverktøy.