Uživatelský vstup do programu můžeme v zásadě rozdělit na dva druhy:
Python nabízí několik různých způsobů, jak zařídit obě možnosti vstupu. V dalším se seznámíme se základními z nich.
Nejzákladnějším způsobem, jak z běžícího programu vyvolat interakci s uživatelem, je pomocí metody input()
:
Uvedený kód čeká na zadání vstupního řetězce ukončeného klávesou ↵
. Zadaný řetězec (bez odřádkování, to jen potvrdilo vstup) je předán jako návratová hodnota funkce (v našem případě tedy do proměnné answer).
Má-li vstupem být třeba celé číslo, je třeba vrácený řetězec na celé číslo převést, tj. provést např. answer = int(answer)
.
raw_input()
.
Metoda input([PROMPT])
má jeden velmi užitečný nepovinný řetězcový parametr, tzv. výzvu (prompt):
PS: Chcete-li chování této uživatelské výzvy vylepšit, můžete před jejím použitím naimportovat modul readline
(dostupný pouze na platformě Unix!). Vstupní řádka pak „získá“ mimo jiné historii a větší možnosti editace (některé klávesové zkratky apod.).
Co se vstupních parametrů skriptu týká, máme v Python'u k dispozici kromě jednoho zcela základního modulu:
sys.argv
– přístup k parametrům skriptu na nejnižší úrovni
...také několik „generací“ modulů vyšší úrovně:
getopt
– nejstarší (a nejklasičtější) nadstavba pro práci s argumenty příkazové řádky
optparse
– vylepšení předchozího modulu; dostupné od verze Python'u 2.3
argparse
– poslední generace modulů pro zpracování argumentů příkazové řádky; dostupné od Python'u 3.2
Zatímco modul sys.argv
je zcela základní a veškerou práci s parsováním vstupních agumentů na potřebné hodnoty si musíte obstarat sami, další moduly poskytují nejrůznější vylepšení, jak téhož dosáhnout snadněji. Z praktických důvodů je modulu argparse
věnována samostatná přednáška.
Nejjednodušším způsobem, jak předat právě spouštěnému programu (skriptu) nějaké údaje, je využít vstupních parametrů skriptu.
Bez argumentů:
S argumenty:
Vidíme, že jméno spouštěného programu je předáno jako první prvek v seznamu argumentů, zatímco vše ostatní je „rozsekáno“ podle mezer a předáno jako další prvky seznamu.
PS: Nezkoušejte míchat parametry s wildcard-znaky, výsledky by vás nejspíš poněkud překvapily...
Pokud bychom chtěli předat jako jeden parametr text, který obsahuje mezery, muzíme ho buď zuvozovkovat (což funguje všude):
..nebo mezery odiskejpovat (což nezabere pod Windows, ale pod UNIXem je to standard):
Typické použití v programu bude vypadat asi následovně:
sys.exit()
ukončíme jeho vykonávání, aby mohl být znovu zavolán (a tentokrát už snad správně).
Samozřejmě si musíte pohlídat, že uživatel zadal potřebný počet parametrů a ve správném tvaru. Pokud ne, dejte mu o tom vědět a ukončete provádění skriptu. (Respektive použijte nějaké výchozí hodnoty, je-li to možné, ale pak o tom též nějakým způsobem informujte. Alespoň v README :)
Smyslem tohoto modulu je víceméně jediné – lidem, kteří jsou zvyklí na céčkovskou funkci getopt(), nabídnout její funkčně podobnou obdobu i v Python'u:
Výstupem funkce je seznam dvojic za všechny přítomné přepínače (:
a =
označují přepínače, které vyžadují vstup) a seznam argumentů. Veškeré testy na povinné přepínače a argumenty a správné hodnoty zadání, stejně jako podrobnou nápovědu si tak musíte kompletně napsat sami, protože getopt za vás zkontroluje prakticky jediné – zda mezi přepínači není nějaký neznámý.
Ukažme si nejdříve chování kódu vybaveného modulem optparse při různých voláních skriptu z příkazové řádky. Daný skript pouze (přehledně) vypisuje, jaké argumenty na příkazové řádce obdržel:
Nevíme, jak program vůbec zavolat, tak to zkusíme bez parametrů:
Aha, takže přepínače nejsou povinné, ale jméno souboru ano. Tak ho zkusíme přidat (test.html):
Vida, přepínače mají nějaké výchozí hodnoty. Nebyla by k nim nějaká nápověda?
python3 optparse.mod.py -h
Tak to zkusme všechno najednou:
-c
jsme změnili stylopisový soubor (klíč cssfile) z výchozího style.css na stylopis.css a přepínačem -x
jsme změnili výchozí hodnotu klíče xhtml_flag z False
na True
. test.html je jméno souboru (určeného ke zpracování).
python.exe optparse.mod.py --xhtml --cssfile=stylopis.css test.html
(znak =
tam sice není povinný, ale lépe se to s ním čte)
Aby se neřeklo, tak ještě obligátní dotaz na verzi programu :)
Příklad na předchozím slajdu je upraven podle ukázky na http://www.saltycrane.com/blog/2009/09/python-optparse-example/ (originální dokumentace k modulu optparse
je velmi „výživná“):
Už na první pohled je modul optparse
poměrně mocný. Pro podrobnosti se podívejte přímo do dokumentace, tady už jen několik poznámek:
options, args = parser.parse_args()
tváří jako slovník, slovník to není :-( Naštěstí to spraví jedno volání funkce vars()
, která převádí svůj argument na slovník (alespoň pokud je to objekt vybavený atributem __dict__):
vars()
není úplně bez problémů, ale pokud pouze „vytáhnete“ hodnoty z parseru, nemělo by se nic zvláštního stát.
store
(výchozí), store_const
(uloží hodnotu parametru const), store_true
, store_false
, append
(přidej nalezenou hodnotu do seznamu), append_const
, count
(inkrementuje odpovídající počitadlo), callback
(vyvolá uvedenou funkci s danými parametry), help
.
optparse.OptionGroup
: