Python-szkripteket szeretne futtatni parancssori argumentumokkal? Ismerje meg, hogyan lehet parancssori argumentumokat elemezni sys, getopt és argparse modulokkal a Pythonban.
A Pythonban, ha a felhasználói bevitelben szeretne olvasni, az input() függvényt kell használnia. Egyes alkalmazásoknál azonban előfordulhat, hogy át kell adni bizonyos argumentumokat, miközben a parancssort futtatja a parancssorban.
Ebben az oktatóanyagban megtanuljuk, hogyan lehet Python-szkriptet futtatni a parancssorban lévő opciókkal és argumentumokkal. Ezután megtanuljuk, hogyan használhatjuk a Python beépített moduljait az ilyen opciók és argumentumok elemzésére.
Kezdjük!
Tartalomjegyzék
A sys.argv megértése Pythonban
Ha C nyelven programozott, akkor tudja, hogy az argumentumok átadásának egyik legegyszerűbb módja a parancssoron keresztül. Ehhez a fő funkciót a következőképpen strukturálhatja:
#include<stdio.h> int main(int argc, char **argv){ //argc: argument count //argv: argument vector //do something on the args return 0; }
Itt az argc az argumentumszámot, az argv pedig az argumentumvektort jelenti.
Python-szkriptek futtatása parancssori argumentumokkal
A Pythonban futtathatja a Python-szkriptet a parancssorban a python3 fájlnév.py használatával. Ilyenkor tetszőleges számú parancssori argumentumot is átadhat:
$ python3 filename.py arg1 arg2 ... argn
A sys modul azonnali támogatást nyújt ezeknek a parancssori argumentumoknak a elérésére és feldolgozására. A sys.argv az összes parancssori argumentum listája, amelyet a Python-szkript futtatásakor átadunk.
Íme egy példa, ahol a main.py fájlt parancssori argumentumokkal futtatjuk:
$ python3 main.py hello world python script
Az argumentumvektort egy egyszerű for ciklus és enumerate függvény segítségével hajthatjuk végre:
# main.py import sys for idx, arg in enumerate(sys.argv): print(f"arg{idx}: {arg}")
# Output arg0:main.py arg1:hello arg2:world arg3:python arg4:script
Látjuk, hogy az első argumentum (a 0 indexnél) a Python fájl neve. A következő érvek pedig az 1-es indextől kezdődnek.
Ez egy minimális munkaprogram, amely elfogadja és feldolgozza a parancssori argumentumokat. Azonban látunk néhány problémát:
- Honnan tudják a program felhasználói, hogy milyen érveket adjanak át?
- És mit támasztanak ezek az érvek?
Ez nem egészen világos. Ennek megoldására használhatja a getopt vagy az argparse modulokat. És ezt megtudjuk a következő részekben.✅
Parancssori argumentumelemzés Python getopt használatával
Tanuljuk meg, hogyan lehet parancssori argumentumokat elemezni a beépített getopt modul segítségével.
A getopt getopt modulból történő importálása után megadhatja az elemezni kívánt argumentumokat, valamint a szkript futtatásához szükséges rövid és hosszú opciókat. A sys.argv 1. indexétől kezdődő összes argumentumot elemezni kell. Tehát az elemezni kívánt szelet a sys.argv[1:].
Itt szükségünk lesz egy üzenet karakterláncra és fájlnévre. Használjuk az m-t és az f-t rövid opcióként, az üzenetet és a fájlt pedig hosszú opcióként.
De hogyan biztosíthatjuk, hogy egy adott lehetőséghez érv szükséges?
- A rövid opciókban beállíthatja, hogy egy opció argumentumot igényeljen, ha a rövid opció neve után kettőspontot (:) ad meg.
- Hasonlóképpen a hosszú opcióknál a hosszú opció után egy = jelet adhatunk hozzá. Meg tudjuk ragadni ezeket a lehetőségeket és a hozzájuk tartozó érveket.
Ezeket hozzáadva a következő kódot kapjuk a main.py fájlban:
# main.py import sys from getopt import getopt opts, args = getopt(sys.argv[1:],'m:f:',['message=","file="]) print(opts) print(args)
Itt az opts változó tartalmazza az opciókat és az argumentumokat sorok listájaként. Minden más, általunk átadott pozicionális argumentum az args változóban lesz összegyűjtve.
A szkript futtatásához átadhatjuk az üzenetet és a fájlnevet, és használhatjuk a rövid vagy a hosszú opciókat.
A main.py futtatása a hosszú opciók használatával a következőket kínálja:
$ python3 main.py --message hello --file somefile.txt
Az opciók és argumentumok sorokban vannak az opts változóban. Mivel nem haladtunk át egyetlen pozíciós érvben sem, az args egy üres lista.
# Output [("--message', 'hello'), ('--file', 'somefile.txt')] []
Ezzel egyenértékűen használhatjuk az alábbi rövid opciókat is:
$ python3 main.py -m hello -f somefile.txt
# Output [('-m', 'hello'), ('-f', 'somefile.txt')] []
⚠️ Ebben a példában a -m short opció nem tévesztendő össze a parancssori -m jelzővel, amely egy modul fő modulként való futtatására szolgál Python-szkript futtatásakor.
Például a python3 -m unittest main.py parancsot használja a unittest fő modulként való futtatásához a main.py futtatásakor.
Említettük, hogy az összes többi pozíciós argumentumot, amelyet átadunk, az args változóban gyűjtjük össze. Íme egy példa:
$ python3 main.py -m hello -f somefile.txt another_argument
Az args lista tartalmazza a másik_argumentum pozíció argumentumot.
# Output [('-m', 'hello'), ('-f', 'somefile.txt')] ['another_argument']
Itt az opts a sorok listája. Így végigcsikorolhatjuk, kicsomagolhatjuk a tuple-t, és kihúzhatjuk az adott opcióknak megfelelő argumentumokat.
De mit tegyünk a fájlnévvel és az üzenettel, miután feldolgoztuk ezeket az argumentumokat? Megnyitjuk a fájlt írási módban, és a nagybetűsre konvertált üzenetet írjuk a fájlba.
# main.py import sys from getopt import getopt opts, args = getopt(sys.argv[1:],'m:f:',['message=","file="]) print(opts) print(args) for option, argument in opts: if option == "-m': message = argument if option == '-f': file = argument with open(file,'w') as f: f.write(message.upper())
Futtassa a main.py fájlt a rövid opciókkal és parancssori argumentumokkal.
$ python main.py -m hello -f thisfile.txt [('-m', 'hello'), ('-f', 'thisfile.txt')] []
A main.py futtatása után a munkakönyvtárunkban láthatjuk a „thisfile.txt” fájlt. Ez tartalmazza a „hello” karakterláncot nagybetűssé alakítva („HELLO”).
$ ls main.py thisfile.txt
$ cat thisfile.txt HELLO
A parancssori argumentumok elemzése az Argparse segítségével
A Python szabványos könyvtárába is beépített argparse modul lehetőséget biztosít parancssori argumentumok elemzésére és parancssori felületek létrehozására is.
A parancssori argumentumok elemzéséhez importáljuk az ArgumentParser osztályt az argparse modulból. Itt példányosítottuk az arg_parser-t, egy ArgumentParser objektumot:
from argparse import ArgumentParser arg_parser = ArgumentParser()
Ezután két parancssori argumentumot szeretnénk hozzáadni:
- üzenet: az üzenet karakterlánc, és
- fájl: annak a fájlnak a neve, amellyel dolgozni szeretnénk.
Most meghívjuk az add_argument() metódust az arg_parser-en mindkét argumentum hozzáadásához. Az add_argument() metódushívásban súgót állíthatunk be egy karakterlánchoz (az argumentum leírásához).
arg_parser.add_argument('message',help='message string') arg_parser.add_argument('file',help='filename')
Eddig példányosítottuk az arg_parser-t, és hozzáadtuk a parancssori argumentumokat. Amikor a program a parancssorban fut, az arg_parser parse_args() metódusával lekérheti az argumentumok értékét.
Itt rögzítjük az argumentum névterét az args változóban. Tehát az args.argument_name segítségével lekérheti az argumentumok értékét.
Az argumentumok értékének beszerzése után a fájlba írjuk az üzenetsort kis- és nagybetűk felcserélésével (a swapcase() string metódussal).
args = arg_parser.parse_args() message = args.message file = args.file with open(file,'w') as f: f.write(message.swapcase())
Mindezt összeadva, íme a main.py fájlunk:
# main.py from argparse import ArgumentParser arg_parser = ArgumentParser() arg_parser.add_argument('message',help='message string') arg_parser.add_argument('file',help='filename') args = arg_parser.parse_args() print(args) message = args.message file = args.file with open(file,'w') as f: f.write(message.swapcase())
A parancssori argumentumok használatának megértése
Az argumentumok használatának megértéséhez a main.py futtatásakor használhatja a –help long opciót, ahogy az ábrán látható:
$ python3 main.py --help usage: main.py [-h] message file positional arguments: message message string file filename optional arguments: -h, --help show this help message and exit
Nincsenek opcionális argumentumok, és mind az üzenet, mind a fájl kötelező pozíció argumentumok. Alternatív megoldásként használhatja a rövid -h opciót is:
$ python3 main.py -h usage: main.py [-h] message file positional arguments: message message string file filename optional arguments: -h, --help show this help message and exit
Amint látható, mindkét argumentum alapértelmezés szerint pozicionális argumentum. Tehát ha nem ad át egy vagy több érvet, akkor hibákba ütközik.
Itt átadtunk egy pozíció argumentumot (Hello) az üzenet karakterlánchoz, de nem adtunk meg értéket a fájl argumentumhoz.
És hibaüzenetet kapunk, amely szerint a fájl argumentum szükséges.
$ python3 main.py Hello usage: main.py [-h] message file main.py: error: the following arguments are required: file
Ha a main.py-t mindkét pozíciós argumentummal futtatjuk, azt látjuk, hogy az args névtér tartalmazza az argumentumok értékeit.
$ python3 main.py Hello file1.txt
# Output Namespace(file="file1.txt", message="Hello")
Ha most megvizsgáljuk a jelenlegi munkakönyvtár tartalmát, azt látjuk, hogy a szkript létrehozza a ‘file1.txt’ fájlt:
$ ls file1.txt main.py
Az eredeti üzenetsor a ‘Hello’; a kis- és nagybetűk felcserélése után a ‘file1.txt’ fájl üzenetsora ‘helLO’.
$ cat file1.txt hELLO
A parancssori argumentumok opcionálissá tétele
Ha ezeket a parancssori argumentumokat nem kötelezővé szeretné tenni, akkor az argumentum nevének elé írhatja a – karaktert.
Módosítsuk a main.py fájlt úgy, hogy az üzenet és a fájl argumentumait is opcionálissá tegyük.
# main.py from argparse import ArgumentParser arg_parser = ArgumentParser() arg_parser.add_argument('--message',help='message string') arg_parser.add_argument('--file',help='filename')
Mivel a parancssori argumentumok nem kötelezőek, ezekhez az argumentumokhoz alapértelmezett értékeket állíthatunk be.
if args.message and args.file: message = args.message file = args.file else: message="Python3" file="myfile.txt"
Ezen a ponton a main.py fájl a következő kódot tartalmazza:
# main.py from argparse import ArgumentParser arg_parser = ArgumentParser() arg_parser.add_argument('--message',help='message string') arg_parser.add_argument('--file',help='filename') args = arg_parser.parse_args() print(args) if args.message and args.file: message = args.message file = args.file else: message="Python3" file="myfile.txt" with open(file,'w') as f: f.write(message.swapcase())
Ha ellenőrizzük a használatot, azt látjuk, hogy az üzenet és a fájl is opcionális argumentum. Ez azt jelenti, hogy mostantól mindkét argumentum nélkül futtathatja a main.py fájlt.
$ python3 main.py --help usage: main.py [-h] [--message MESSAGE] [--file FILE] optional arguments: -h, --help show this help message and exit --message MESSAGE message string --file FILE filename
$ python3 main.py
Az argumentum névtérben a fájl és az üzenet is Nincs.
# Output Namespace(file=None, message=None)
Azt látjuk, hogy az alapértelmezett fájlnév és üzenet: „sajatfájl.txt” és „Python3”. A ‘myfile.txt’ fájl most a munkakönyvtárban található:
$ ls file1.txt main.py myfile.txt
És tartalmazza a „Python3” karakterláncot a felcserélt betűk kis- és nagybetűivel:
$ cat myfile.txt pYTHON3
Használhatja a –message és a –file argumentumot is, hogy olvashatóbbá tegye a parancsot.
$ python3 main.py --message Coding --file file2.txt
# Output Namespace(file="file2.txt", message="Coding")
Látjuk a ‘file2.txt’ fájlt a munkakönyvtárban:
$ ls file1.txt file2.txt main.py myfile.txt
És a várt módon tartalmazza a ‘CODING’ karakterláncot.
$ cat file2.txt cODING
Következtetés
Íme egy összefoglaló az oktatóanyagban tanultakról:
- A C programozási nyelvhez hasonlóan a Pythonban is elérheti a parancssori argumentumokat a sys.argv argumentumvektoron keresztül. sys.argv[0] a Python szkript neve. Tehát a sys.argv argumentumok elemzése érdekel bennünket[1:].
- Az olvashatóság javítása és az opciók hozzáadásához azonban használhatja a getopt és az argparse modulokat.
- A getopt modul segítségével elemezheti a parancssori argumentumok listáját az 1. indextől kezdve a lista végéig. Megadhat rövid és hosszú opciókat is.
- Ha egy opció argumentumot vesz fel, megadhat egy kettőspontot (:) és = a rövid és a hosszú opció után.
- A Python argparse moduljával létrehozhat egy ArgumentParser objektumot, és az add_argument() metódussal hozzáadhat egy szükséges pozíciós argumentumot. Használja — az argumentum neve előtt, hogy opcionális legyen.
- A parancssori argumentumok értékeinek lekéréséhez hívja meg a parse_args() metódust az ArgumentParser objektumon.
Ezután tanulja meg, hogyan hajthat végre biztonságos kivonatolást Pythonban.