Hvis du bruger Linux, vil du helt sikkert elske shell-kommandoerne.
Og hvis du arbejder med Python, så har du måske prøvet at automatisere tingene. Det er en måde at spare tid på. Du kan også have nogle bash-scripts til at automatisere ting.
Python er praktisk til at skrive scripts end bash. Og det er nemt at administrere Python-scripts sammenlignet med bash-scripts. Du vil finde det svært at vedligeholde bash-scripts, når det først vokser.
Men hvad hvis du allerede har bash-scripts, som du vil køre ved hjælp af Python?
Er der nogen måde at udføre bash-kommandoer og scripts i Python?
Ja, Python har et indbygget modul kaldet subprocess, som bruges til at udføre kommandoer og scripts inde i Python-scripts. Lad os se, hvordan man udfører bash-kommandoer og scripts i Python-scripts i detaljer.
Indholdsfortegnelse
Udførelse af bash-kommandoer
Som du måske allerede har set, bruges modulunderprocessen til at udføre bash-kommandoer og scripts. Det giver forskellige metoder og klasser til det samme.
Der er hovedsageligt én metode og én klasse at kende til fra delprocesmodulet. De er kørt og Popen. Disse to hjælper os med at udføre bash-kommandoer i Python-scripts. Lad os se dem én efter én.
subprocess.run()
Metoden subprocess.run() vil tage en liste over strenge som et positionsargument. Dette er obligatorisk, da det har bash-kommandoen og argumenter for det. Det første element på listen er kommandonavnet, og de resterende elementer er argumenterne til kommandoen.
Lad os se et hurtigt eksempel.
import subprocess subprocess.run(["ls"])
Ovenstående script viser alle elementerne i den aktuelle arbejdsmappe som scriptet ligger. Der er ingen argumenter til kommandoen i ovenstående script. Vi har kun givet bash-kommandoen. Vi kan give yderligere argumenter til ls-kommandoen som -l, -a, -la osv.
Lad os se et hurtigt eksempel med kommandoargumenter.
import subprocess subprocess.run(["ls", "-la"])
Ovenstående kommando viser alle filerne inklusive skjulte filer sammen med tilladelserne. Vi har givet argumentet la som viser filer og mapper ekstra information og skjulte filer.
Vi kan ende med at lave nogle fejl, mens vi skriver kommandoerne. Fejl vil rejse i henhold til fejlene. Hvad hvis du vil fange dem og bruge dem senere? Ja, vi kan gøre det ved at bruge søgeordsargumentet stderr.
Lad os se et eksempel.
import subprocess result = subprocess.run(["cat", "sample.txt"], stderr=subprocess.PIPE, text=True) print(result.stderr)
Sørg for, at du ikke har filen med navnet sample.txt i arbejdsmappen. Værdien til søgeordsargumentet stderr er PIPE, som hjælper med at returnere fejlen i et objekt. Vi kan få adgang til det senere med samme navn. Og søgeordsargumentteksten hjælper med at fortælle, at outputtet skal være en streng.
På samme måde kan vi fange outputtet af kommandoen ved hjælp af stdout nøgleordsargumentet.
import subprocess result = subprocess.run(["echo", "Hello, World!"], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True) print(result.stdout)
subprocess.run() – input
Du kan give input til kommandoerne ved hjælp af input nøgleordet argument. Vi vil give input i et strengformat. Så vi skal indstille søgeordsargumentteksten til True. Som standard tager det det i bytes.
Lad os se på et eksempel.
import subprocess subprocess.run(["python3", "add.py"], text=True, input="2 3")
I ovenstående program vil Python-scriptet add.py tage to tal som input. Vi har givet input til Python-scriptet ved hjælp af input nøgleordet argument.
subprocess.Popen()
Klassen subprocess.Popen() er avanceret end metoden subprocess.run(). Det giver os flere muligheder for at udføre kommandoerne. Vi vil oprette en instans af subprocess.Popen() og bruge den til forskellige ting som at kende status for kommandoudførelsen, få output, give input osv..,
Der er flere metoder i klassen subprocess.Popen(), som vi har brug for at kende. Lad os se dem én efter én sammen med kodeeksemplerne.
vente
Det bruges til at vente til fuldførelsen af udførelsen af kommandoen. De næste linjer i Python-scriptet udføres ikke før færdiggørelsen af den forrige kommando, der er skrevet efter ventemetoden. Lad os se eksemplet.
import subprocess process = subprocess.Popen(["ls", "-la"]) print("Completed!")
Kør ovenstående kode og observer outputtet. Du vil se, at meddelelsen afsluttet! udskrives før udførelse af kommandoen. Vi kan undgå det ved at bruge ventemetoden. Lad os vente til fuldførelsen af kommandoen.
import subprocess process = subprocess.Popen(["ls", "-la"]) process.wait() print("Completed!")
Hvis du ser outputtet for ovenstående kode, vil du indse, at ventetiden faktisk virker. Print-sætningen udføres efter fuldførelsen af kommandoudførelsen.
kommunikere
Metoden communicate bruges til at få output, fejl og give input til kommandoen. Det returnerer en tuple, der indeholder henholdsvis output og fejl. Lad os se et eksempel.
import subprocess process = subprocess.Popen(["echo", "Hello, World!"], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True) result = process.communicate() print(result)
subprocess.Popen() – input
Vi kan ikke videregive input til klassen Popen direkte. Vi skal bruge søgeordsargumentet kaldet stdin for at give input til kommandoen. Forekomsten af klassen Popen vil give os stdin-objekt. Den har en metode kaldet skrive, som bruges til at give input til kommandoen.
Som vi diskuterede tidligere, vil det tage input som bytes-lignende objekter som standard. Så glem ikke at indstille søgeordsargumentteksten til True, mens du opretter forekomsten af Popen.
Lad os se et eksempel.
import subprocess process = subprocess.Popen(["python3", "add.py"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True) process.stdin.write("2 3") process.stdin.close() print(process.stdout.read())
afstemning
Metodeafstemningen bruges til at kontrollere, om udførelsen af kommandoen er fuldført eller ej. Denne metode vil returnere Ingen, hvis kommandoen stadig udføres. Lad os se et eksempel.
import subprocess process = subprocess.Popen(['ping', '-c 5', 'geekflare.com'], stdout=subprocess.PIPE, text=True) while True: output = process.stdout.readline() if output: print(output.strip()) result = process.poll() if result is not None: break
I ovenstående kode har vi brugt ping-kommandoen med 5 anmodninger. Der er en uendelig løkke, der itererer indtil afslutningen af kommandoudførelsen. Vi har brugt metodeafstemningen til at kontrollere status for kommandoudførelsen. Hvis metodeafstemningen returnerer anden kode end Ingen, fuldføres eksekveringen. Og den uendelige sløjfe går i stykker.
Udførelse af Bash-scripts
Vi har set to måder at udføre kommandoerne på. Lad os nu se, hvordan man udfører bash-scripts i Python-scripts.
Underprocessen har en metode kaldet call. Denne metode bruges til at udføre bash-scripts. Metoden returnerer exit-koden fra bash-scriptet. Standard exit-koden for bash-scripts er 0. Lad os se et eksempel.
Opret et bash-script med navnet practice.sh som følger.
#!/bin/bash echo "Hello, World!" exit 1
Skriv nu et Python-script og kør ovenstående bash-script.
import subprocess exit_code = subprocess.call('./practice.sh') print(exit_code)
Du får følgende output, når du kører ovenstående Python-script.
Hello, World! 1
Konklusion
Vi har set, hvordan man udfører bash-kommandoer og scripts i Python. Du kan bruge dem til at automatisere ting mere effektivt.
Glædelig kodning 👨💻