Hogyan lehet bash szkripteket futtatni Python használatával?

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.

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.

  Vágjon ki HD-fotókat egy videóból iPhone-ján

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.

  Az Open Broadcaster (OBS) telepítése az Ubuntuban

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.

  Hogyan adhatja hozzá kedvenc beállításait a Mac Dockhoz

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 👨‍💻