Ha Linuxot használ, akkor biztosan szeretni fogja a shell parancsokat.
És ha Pythonnal dolgozik, akkor lehet, hogy megpróbálta automatizálni a dolgokat. Ez egy módja annak, hogy időt takarítson meg. Lehet, hogy van néhány bash szkriptje a dolgok automatizálására.
A Python kényelmesebb szkriptek írásához, mint a bash. A Python-szkriptek kezelése pedig egyszerű a bash-szkriptekhez képest. Nehéz lesz karbantartani a bash szkripteket, ha azok növekednek.
De mi van akkor, ha már rendelkezik bash szkriptekkel, amelyeket Python használatával szeretne futtatni?
Van-e mód a bash parancsok és szkriptek végrehajtására Pythonban?
Igen, a Pythonnak van egy beépített modulja, az úgynevezett alfolyamat, amely a Python-szkripteken belüli parancsok és szkriptek végrehajtására szolgál. Nézzük meg részletesen, hogyan hajthatunk végre bash parancsokat és szkripteket Python szkriptekben.
Tartalomjegyzék
Bash parancsok végrehajtása
Amint azt már láthatta, a modul alfolyamata a bash parancsok és szkriptek végrehajtására szolgál. Ugyanahhoz különböző metódusokat és osztályokat biztosít.
Főleg egy metódust és egy osztályt kell tudni az alfolyamat modulból. Ők futnak és Popen. Ez a kettő segít nekünk a bash parancsok végrehajtásában Python szkriptekben. Lássuk őket egyenként.
subprocess.run()
A subprocess.run() metódus a karakterláncok listáját veszi fel helyzeti argumentumként. Ez kötelező, mivel tartalmazza a bash parancsot és argumentumokat. A lista első eleme a parancs neve, a többi elem pedig a parancs argumentumai.
Lássunk egy gyors példát.
import subprocess subprocess.run(["ls"])
A fenti szkript felsorolja az összes elemet az aktuális munkakönyvtárban a szkript szerint. A fenti parancsfájlban nincsenek argumentumok a parancshoz. Csak a bash parancsot adtuk ki. További argumentumokat adhatunk az ls parancshoz, például -l, -a, -la stb.
Lássunk egy gyors példát parancs argumentumokkal.
import subprocess subprocess.run(["ls", "-la"])
A fenti parancs megjeleníti az összes fájlt, beleértve a rejtett fájlokat is, az engedélyekkel együtt. Megadtuk az la argumentumot, amely a fájlok és könyvtárak extra információkat és a rejtett fájlokat jeleníti meg.
A parancsok írása közben hibákat követhetünk el. A hibák a hibáknak megfelelően növekednek. Mi van, ha meg akarja örökíteni és később használni szeretné őket? Igen, ezt megtehetjük a stderr kulcsszó argumentumával.
Lássunk egy példát.
import subprocess result = subprocess.run(["cat", "sample.txt"], stderr=subprocess.PIPE, text=True) print(result.stderr)
Győződjön meg arról, hogy nincs a sample.txt nevű fájl a munkakönyvtárban. Az stderr kulcsszó argumentum értéke PIPE, amely segít visszaadni a hibát egy objektumban. Később ugyanazzal a névvel érhetjük el. A kulcsszó argumentum szövege pedig segít megmondani, hogy a kimenetnek karakterláncnak kell lennie.
Hasonlóképpen rögzíthetjük a parancs kimenetét az stdout kulcsszó argumentumával.
import subprocess result = subprocess.run(["echo", "Hello, World!"], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True) print(result.stdout)
subprocess.run() – bemenet
A parancsokat az input kulcsszó argumentumával adhatja meg. A bemeneteket karakterlánc formátumban adjuk meg. Tehát a kulcsszó argumentum szövegét igazra kell állítanunk. Alapértelmezés szerint bájtokban veszi fel.
Nézzünk egy példát.
import subprocess subprocess.run(["python3", "add.py"], text=True, input="2 3")
A fenti programban az add.py Python szkript két számot vesz fel bemenetként. Az input kulcsszó argumentum használatával megadtuk a bemenetet a Python szkriptnek.
alfolyamat.Popen()
A subprocess.Popen() osztály fejlettebb, mint a subprocess.run() metódus. Több lehetőséget ad a parancsok végrehajtására. Létrehozzuk a subprocess.Popen() egy példányát, és különféle dolgokra használjuk, mint például a parancsvégrehajtás állapotának megismerése, kimenet lekérése, bemenet megadása stb.,
A subprocess.Popen() osztálynak több metódusa van, amelyeket tudnunk kell. Lássuk őket egyenként a kódpéldákkal együtt.
várjon
Ez arra szolgál, hogy megvárja a parancs végrehajtásának befejezését. A Python-szkript következő sorai nem hajtódnak végre a várakozási metódus után írt előző parancs befejezéséig. Lássuk a példát.
import subprocess process = subprocess.Popen(["ls", "-la"]) print("Completed!")
Futtassa a fenti kódot, és figyelje meg a kimenetet. Látni fogja, hogy az üzenet Kész! a parancs végrehajtása előtt kerül kinyomtatásra. A várakozás módszerével elkerülhetjük. Várjuk meg a parancs befejezését.
import subprocess process = subprocess.Popen(["ls", "-la"]) process.wait() print("Completed!")
Ha látja a fenti kód kimenetét, akkor rájön, hogy a várakozás valóban működik. A print utasítás a parancs végrehajtásának befejezése után kerül végrehajtásra.
kommunikálni
A kommunikációs módszer a kimenet, a hiba lekérésére és a parancs bemenetének megadására szolgál. Egy kimenetet és hibát tartalmazó sort ad vissza. Lássunk egy példát.
import subprocess process = subprocess.Popen(["echo", "Hello, World!"], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True) result = process.communicate() print(result)
részfolyamat.Popen() – bemenet
A bemenetet nem tudjuk közvetlenül átadni a Popen osztálynak. A parancs beviteléhez az stdin nevű kulcsszó argumentumot kell használnunk. A Popen osztály példánya stdin objektumot biztosít számunkra. Van egy írás nevű metódusa, amely a parancs bemenetének megadására szolgál.
Amint azt korábban tárgyaltuk, alapértelmezés szerint bájtszerű objektumokként veszi fel a bemeneteket. Tehát ne felejtse el a kulcsszó argumentumának szövegét igazra állítani a Popen példányának létrehozásakor.
Lássunk egy példát.
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())
közvélemény kutatás
A metódus lekérdezése annak ellenőrzésére szolgál, hogy a parancs végrehajtása befejeződött-e vagy sem. Ez a metódus a None értéket adja vissza, ha a parancs még mindig fut. Lássunk egy példát.
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
A fenti kódban a ping parancsot használtuk 5 kéréssel. Van egy végtelen ciklus, amely a parancs végrehajtásának befejezéséig ismétlődik. A metódus poll segítségével ellenőriztük a parancsvégrehajtás állapotát. Ha a metódus lekérdezése a None-tól eltérő kódot ad vissza, akkor a végrehajtás befejeződik. És a végtelen hurok megszakad.
Bash szkriptek végrehajtása
Kétféle módot láttunk a parancsok végrehajtására. Most nézzük meg, hogyan kell végrehajtani a bash szkripteket Python szkriptekben.
Az alfolyamatnak van egy hívás nevű metódusa. Ez a módszer a bash szkriptek végrehajtására szolgál. A metódus visszaadja a bash parancsfájl kilépési kódját. A bash szkriptek alapértelmezett kilépési kódja 0. Lássunk egy példát.
Hozzon létre egy bash szkriptet praktika.sh néven az alábbiak szerint.
#!/bin/bash echo "Hello, World!" exit 1
Most írjon egy Python-szkriptet, és futtassa a fenti bash-szkriptet.
import subprocess exit_code = subprocess.call('./practice.sh') print(exit_code)
A fenti Python-szkript futtatása után a következő kimenetet kapja.
Hello, World! 1
Következtetés
Láttuk, hogyan lehet bash parancsokat és szkripteket végrehajtani Pythonban. Használhatja őket a dolgok hatékonyabb automatizálására.
Boldog kódolást 👨💻