Hogy miért? Minden konzolos, linuxos program kezel paranccsori paramétereket, ha mást nem, akkor a --help és a --version opciókat. A --help vagy -h a program vagy parancs használatát írja le röviden, a -v vagy --version pedig a nevét és verziószámát írja ki.
A python remek kis eszközöket biztosít nekünk az argumentum vagy paraméterkezelés megvalósítására. Mi most az getopt modullal ismerkedünk meg.
Mit szeretnénk? Azt, hogy a hangman programocskánk kezelje az alábbi parancssori argumentumokat:
- -h, --help : ezekre adjon egy rövid használati útmutatót
- -v, --version : erre adja meg a program verziószámát
- -f, --file fájlnév : ennek hatására a hangman egyéni szólistát olvas be
def help(): print """HANGMAN program oktatási célra Használat: python hangman.py [paraméterek] Paraméterek: -h, --help : ez a leírás -v, --version : a program verziószáma -f fajlnév, --file fájlnév : a betöltendő szófájl neve """
Először is, a getopt modult be kell importálnunk, ezért az import sorok alá szúrjunk be egy import getopt sort. A program végére az alábbi kódrészlet kerül (lecseréljük az eddigi pár sort ott a végén).
if __name__=="__main__": try: optlist, args = getopt.getopt(sys.argv[1:], "hvf:", ["help", "version", "file="]) except getopt.GetoptError: help() sys.exit(2) for opt,param in optlist: if opt in ('-h','--help'): help() sys.exit(0) elif opt in ('-v', '--version'): print "Hangman játék "+VERZIO sys.exit(0) elif opt in ('-f','--file'): SZOFAJL=param j=Jatek() UJJATEK=True while UJJATEK: j.start() ujjatek=raw_input("Új játék? [i]/n : ") if ujjatek in ('n','N'): print "Viszlát legközelebb!" UJJATEK=False
Mielőtt azonban elmélyednénk a getopt részleteiben, menjünk végig ezen a néhány soron. Az első amit észre kell vennünk, hogy a program lényegi végrehajtó része belekerült egy if blokkba. Mit vizsgálunk ebben? Azt, hogy a hangman.py programként lett-e indítva, vagy beimportálásra csak került. A __name__ beépített változó a __main__ nevet tartalmazza akkor, ha programként indítottuk, és a modulnevet, ha importáltuk. Importáláskor ugyanis nincs szükség programvégrehajtásra a szó köznapi értelmében, olyankor csak az osztályok kellenek nekünk.
- a 2-6 sorokban beolvassuk a parancssori argumentumainkat az optlist és args változókba. Ha érvénytelen paramétert kaptunk, akkor meghívjuk a help() függvényünket, és 2-es hibakóddal kilépünk.
- a 7-15 sorban lévő ciklusban végiglépkedünk a kapott agumentumlistán
- ha -h vagy --help paramétert kaptunk, akkor kiírjuk a helpet, és 0-ás hibakóddal kilépünk (sys.exit(0))
- ha a paraméter -v vagy --version, akkor kiírjuk a verziószámot, és 0-ás hibakóddal kilépünk (sys.exit(0))
- ha a paraméter -f vagy --file, akkor a mögötte lévő argumentumot állítjuk be a SZOFAJL váltózba, így a játék induláskor ebből tölti fel a szólistát
- további újdonság, hogy a végrehajtást egy while ciklusba illesztettük, és a játék véget érte után megkérdezzük a felhasználót, akarja-e folytatni. Ha nem, akkor az UJJATEK változó False-ra állításával kilépünk a while ciklusból, és a program véget ér.
optlist,args=getopt.getopt(argumentumlista, rövidparamétereklistája, hosszúparamétereklistája)
feldolgozza az argumentumlistában lévő elemeket, úgy hogy összehasonlítja a rövid és hosszú paraméterek listájával, majd egy kételemű tuple-t ad vissza, amelnyek első eleme - jelen esetben az optilst -, egy szintén kételemű tuple-kből álló lista, amelyben a kapott paraméterek találhatók a saját argumentumaikkal párosítva, a második elem a kimeneti tuple-ből pedig a paraméterek utáni argumentumokból áll.
Az argumentumlista előállítását a sys modul végzi. Mivel a sys.args[0] mindig a program saját neve, ez nem parancssori paraméter, ezért nem adjuk át a getopt-nak, ezért szeleteljük és a sys.args[1:] listát adjuk át.
A rövidparamétereklistája egy string, amiben megadjuk a getopt-nak, hogy programunk milyen rövid paramétereket kezel le. Ha egy betű után kettőspontot teszünk, akkor az a paraméter saját argumentummal rendelkezik.
A hosszúparamétereklistája egy python lista string elemekkel, amelyek sorrendben a rövid paraméterek hosszú megfelelői, azaz pl. -h --> --help, -v --> --version. Ha a rövid párjánál kettősponttal jeleztük, hogy a paraméternek plusz argumentuma van, akkor a hosszú párjánál egyenlőségjelet kell tennünk ehhez.
Példák:
>>> import getopt >>> arglist=['-h','--file','fajlnev','-v'] >>> optlist,args=getopt.getopt(arglist,"hf:v",["help", "file=","version"]) >>> optlist [('-h', ''), ('--file', 'fajlnev'), ('-v', '')] >>> args [] >>> arglist=['-h','--file','fajlnev','-v','arg1','arg2'] >>> optlist,args=getopt.getopt(arglist,"hf:v",["help", "file=","version"]) >>> optlist [('-h', ''), ('--file', 'fajlnev'), ('-v', '')] >>> args ['arg1', 'arg2']
A v1.1 verzió zippelve elérhető itt.
A következő alkalommal többnyelvűsítjük hangman-ünket.
Tanulmányozásra ajánlom még az argparse modult, ha igény van rá, körüljárjuk azt is.
VálaszTörlés