Shell parancsok végrehajtása Pythonban az alfolyamat futtatási módszerrel

How Execute Shell Commands Python Using Subprocess Run Method



Az alfolyamat egy beépített Python-modul, amely új folyamatok létrehozására és a bemeneti és kimeneti adatfolyamokkal való kölcsönhatásra használható. Egyszerűbben fogalmazva, használhatja shell parancsok futtatására és futtatható bináris fájlok futtatására, amelyek általában szétszórva vannak a különböző tárolómappákban egy Linux fájlrendszerben. Egy teljes elérési utat is megadhat egy futtatható bináris fájlhoz, és használhatja a bináris fájlhoz társított parancssori kapcsolókat. Ez a cikk elmagyarázza, hogyan kell használni az alfolyamat -modult és annak futtatási módszerét a Python -alkalmazásokban. A cikkben található összes kódmintát a Python 3.8.2 segítségével tesztelték az Ubuntu 20.04 rendszeren.

Az alprocess.run módszer

A Subprocess.run metódus felveszi az argumentumok listáját. A metódus meghívásakor végrehajtja a parancsot, és megvárja, amíg a folyamat befejeződik, és végül egy CompletedProcess objektumot ad vissza. A CompletedProcess objektum stdout, stderr, a metódus meghívása során használt eredeti argumentumokat és visszatérési kódot ad vissza. Az Stdout a parancs által létrehozott adatfolyamra utal, míg az stderr a program végrehajtása során felmerülő hibákra utal. Bármely nullától eltérő visszatérési kód (kilépési kód) hibát jelentene a subprocess.run metódusban végrehajtott paranccsal.







1. példa: Egy szövegfájl kimeneti tartalma a Subprocess.run metódussal

Az alábbi parancs egy data.txt fájl tartalmát adja ki, feltételezve, hogy az tartalmaz egy name = John karakterláncot.



import alfolyamat
alfolyamat.fuss(['macska', 'data.txt'])

A fenti kód futtatása a következő kimenetet adja vissza:



név=János
CompletedProcess(args=['macska', 'data.txt'],visszatérési kód=0)

A lista argumentum első eleme a végrehajtandó parancs neve. Az első elemet követő lista bármely eleme parancssori beállítás vagy kapcsoló. A beállítások megadásához használhat egyetlen kötőjel és kettős kötőjelet is. Például egy könyvtár fájljainak és mappáinak felsorolásához a kód a subprocess.run ([ls, -l] lehet. Az esetek többségében a shell parancs bármely szóközzel elválasztott argumentumát egyéni elemnek tekintheti a az alprocess.run metódushoz adott lista.





2. példa: Az alprocess.run módszer kimenetének elnyomása

Az alprocess.run metódus kimenetének elnyomásához további argumentumként meg kell adnia az stdout = subprocess.DEVNULL és az stderr = subprocess.DEVNULL értéket.

import alfolyamat

alfolyamat.fuss(['macska', 'data.txt'],stdout=alfolyamat.DEVNULL,
stderr=alfolyamat.DEVNULL)

A fenti kód futtatása a következő kimenetet eredményezi:



CompletedProcess (args = ['macska', 'data.txt'], returncode = 0)

3. példa: A Subprocess.run metódus rögzítésének kimenete

Az alprocess.run metódus kimenetének rögzítéséhez használjon további argumentumot, Capture_output = True néven.

import alfolyamat
Kimenet= alfolyamat.fuss(['macska', 'data.txt'],capture_output=Igaz)
nyomtatás (Kimenet)

A fenti kód futtatása a következő kimenetet eredményezi:

CompletedProcess(args=['macska', 'data.txt'],visszatérési kód=0,
stdout=b'név = János n',stderr=b'')

Az output.stdout és output.stderr metódusokkal egyenként hozzáférhet az stdout és stderr értékekhez. A kimenet bájtsorozatként készül. Ha karakterláncot szeretne kapni kimenetként, használja az output.stdout.decode (utf-8) metódust. A text = True szöveget további argumentumként is megadhatja az alprocess.run híváshoz, hogy a kimenetet karakterlánc formátumban kapja meg. A kilépési állapotkód lekéréséhez használja az output.returncode metódust.

4. példa: A kivétel növelése az alprocess.run módszerrel végrehajtott parancs meghiúsulása esetén

Kivétel felvetéséhez, amikor a parancs nem nullás állapotú kilép, használja a check = True argumentumot.

import alfolyamat
alfolyamat.fuss(['macska', 'data.tx'],capture_output=Igaz,szöveg=Igaz,jelölje be=Igaz)

A fenti kód futtatása a következő kimenetet eredményezi:

raise CalledProcessError (retcode, process.args,
alprocess.ColedProcessError: Parancs '[' cat ',' data.tx ']'
visszaadta a nullától eltérő kilépési állapotot 1.

5. példa: Adjon meg egy karakterláncot az alprocess.run metódussal végrehajtott parancsnak

Egy karakterláncot adhat át a subprocess.run metódussal végrehajtandó parancsnak az input = ’string’ argumentum használatával.

import alfolyamat
Kimenet= alfolyamat.fuss(['macska'], bemenet='data.txt',capture_output=Igaz,
szöveg=Igaz,jelölje be=Igaz)
nyomtatás (Kimenet)

A fenti kód futtatása a következő kimenetet eredményezi:

CompletedProcess (args = ['macska'], returncode = 0, stdout = 'data.txt', stderr = '')

Amint láthatja, a fenti kód a data.txt fájlt karakterláncként továbbítja, nem pedig fájlobjektumként. A data.txt fájl fájlként történő továbbításához használja az stdin argumentumot.

val vel nyisd ki('data.txt') mintf:
Kimenet= alfolyamat.fuss(['macska'],stdin=f,capture_output=Igaz,
szöveg=Igaz,jelölje be=Igaz)
nyomtatás (Kimenet)

A fenti kód futtatása a következő kimenetet eredményezi:

CompletedProcess (args = ['macska'], returncode = 0, stdout = 'név = János n', stderr = '')

6. példa: Parancs végrehajtása közvetlenül a Shell -ben a Subprocess.run metódussal

Lehetőség van arra, hogy a parancsot közvetlenül a héjba futtassuk, ahelyett, hogy a főparancsban és az azt követő beállításokban szereplő karakterláncokat használnánk. Ehhez további argumentumként át kell adnia a shell = True parancsot. Ezt azonban a python -fejlesztők nem ajánlják, mivel a shell = True használata biztonsági problémákat okozhat. A biztonsági vonatkozásokról itt olvashat bővebben itt .

import alfolyamat
alfolyamat.fuss('macska' data.txt '',héj=Igaz)

A fenti kód futtatása a következő kimenetet eredményezi:

név = János

Következtetés

A subprocess.run metódus a Pythonban meglehetősen hatékony, mivel lehetővé teszi shell parancsok futtatását a pythonon belül. Ez segít abban, hogy az összes kódot magára a pythonra korlátozza anélkül, hogy további shell script kódnak kellene külön fájlokban lennie. Elég bonyolult lehet azonban a shell parancsok helyes tokenizálása egy python listában. Használhatja a shlex.split () metódust egyszerű shell parancsok tokenizálására, de a hosszú, összetett parancsokban - különösen azokban, amelyek cső szimbólumokkal rendelkeznek - a shlex nem tudja megfelelően felosztani a parancsot. Ilyen esetekben a hibakeresés bonyolult probléma lehet. Ennek elkerülése érdekében használhatja a shell = True argumentumot, de bizonyos biztonsági aggályok társulnak ehhez a művelethez.