Obsah
1. IPython – jedno z nejpropracovanějších interaktivních prostředí pro práci s Pythonem
2. IPython pro různé verze programovacího jazyka Python
3. První seznámení s IPythonem
4. Volba způsobu ovládání IPythonu
5. Standardní klávesové zkratky v režimu emulace Emacsu
6. Standardní klávesové zkratky v režimu emulace Vi/Vimu
7. Vstupní řádek a koncept buněk
8. Historie zadávaných příkazů a jejich výsledků
9. Automatické odsazování zapisovaného kódu
10. Doplňování názvů funkcí, metod a proměnných
11. Introspekce: zobrazení informací o vybraném objektu
14. Kouzelné funkce %cpaste a %edit
15. Načtení, uložení a zveřejnění zdrojových kódů
16. Databáze s historií spouštěných příkazů
17. Vybrané „konkurenční“ projekty
18. Projekty bpython, ptpython a dreampie
1. IPython – jedno z nejpropracovanějších interaktivních prostředí pro práci s Pythonem
Pravděpodobně všichni vývojáři, kteří používají programovací jazyk Python, se seznámili s interaktivním režimem Pythonu. Tento režim, který se taktéž někdy nazývá interaktivní smyčka REPL (což je zkratka vycházející z plného označení Read-Eval-Print-Loop, které pochází z dávného období, v němž vznikal programovací jazyk LISP) se použije ve chvíli, kdy spustíme interpret Pythonu bez specifikace skriptu, který se má analyzovat a následně spustit (s poloskrytým mezipřekladem do bajtkódu). Samotná interaktivní smyčka REPL se může nacházet v několika stavech, které se rozlišují takzvanou výzvou (prompt). Ve výchozím stavu se očekává specifikace jednoho příkazu, který se ihned vykoná po stisku klávesy Enter, ovšem můžeme si taktéž nechat zobrazit nápovědu, začít zadávat deklaraci funkce či třídy atd. V takovém případě se očekává víceřádkový vstup a výzva se změní.
Obrázek 1: Interaktivní smyčka REPL programovacího jazyka Python verze 2.7.6 (což je dnes již zastaralá varianta).
Ovšem samotná standardní smyčka REPL má některá (možná bychom mohli říci spíše mnohá) omezení. Sice umožňuje doplnění klíčového slova nebo jména funkce/metody klávesou TAB, ovšem již mnohdy nedokáže rozlišit kontext pro doplňování (jméno souboru atd.). Taktéž se špatně vrací v historii příkazů ve chvíli, kdy se jedná například o několikařádkovou deklaraci. A navíc REPL automaticky neprovádí odsazení příkazů uvnitř bloku, což je pro programovací jazyk, v němž hraje odsazení zcela zásadní roli, dosti nepříjemné:
>>> def x(): ... pass File "<stdin>", line 2 pass ^ IndentationError: expected an indented block
Taktéž je problematické volání příkazů shellu, což je mnohdy velmi užitečná vlastnost. Dále popsaný projekt IPython (a taktéž některé další nástroje zmíněné v sedmnácté kapitole a kapitole osmnácté) tyto problémy řeší a navíc uživatelům nabízí i mnohé další funkce a techniky vhodné pro doslova každodenní používání.
Obrázek 2: Interaktivní smyčka REPL programovacího jazyka Python verze 3.6.3 (což je opět již postarší verze).
Samotný projekt IPython vznikl již v roce 2001, kdy se jednalo o velmi malý pomocný nástroj čítající pouhých 259 řádků kódu vytvořených v Pythonu. Autorem této verze byl Fernando Perez, který se vývoji IPythonu věnoval i dále. Další verze nabídly číslované vstupy (takzvané buňky), paměť pro výstup příkazů, načtení často používaných knihoven atd. IPython se začal používat pro datové analýzy a na jeho základě později vznikl projekt Jupyter Notebook. Dnes se ovšem budeme věnovat klasickému IPythonu.
2. IPython pro různé verze programovacího jazyka Python
Na některých operačních systémech se stále ještě setkáme s tím, že existují balíčky s IPythonem postaveným na Pythonu 2 a současně i další verze postavená na Pythonu 3. V takovém případě je bezpečnější při instalaci určit verzi IPythonu přesně, například následovně (i když konkrétně Fedora 33 už IPython postavený na Pythonu 2 nenabízí):
# dnf install python3-ipython
Instalace probíhá zcela standardním způsobem:
Last metadata expiration check: 2:56:32 ago on Tue 16 Feb 2021 11:14:20 AM CET. Dependencies resolved. ================================================================================ Package Arch Version Repository Size ================================================================================ Installing: python3-ipython noarch 7.18.1-1.fc33 beaker-Fedora-Everything 800 k Installing dependencies: python3-backcall noarch 0.1.0-11.fc33 beaker-Fedora-Everything 27 k python3-ipython_genutils noarch 0.1.0-23.fc33 beaker-Fedora-Everything 51 k python3-jedi noarch 0.17.1-2.fc33 beaker-Fedora-Everything 1.0 M python3-parso noarch 0.7.0-2.fc33 beaker-Fedora-Everything 147 k python3-pexpect noarch 4.8.0-5.fc33 beaker-Fedora-Everything 134 k python3-pickleshare noarch 0.7.5-4.fc33 beaker-Fedora-Everything 18 k python3-prompt-toolkit noarch 3.0.5-4.fc33 beaker-Fedora-Everything 576 k python3-ptyprocess noarch 0.6.0-11.fc33 beaker-Fedora-Everything 30 k python3-pygments noarch 2.6.1-5.fc33 updates 1.8 M python3-traitlets noarch 4.3.3-4.fc33 beaker-Fedora-Everything 159 k python3-wcwidth noarch 0.2.5-2.fc33 beaker-Fedora-Everything 42 k Transaction Summary ================================================================================ Install 12 Packages Total download size: 4.8 M Installed size: 21 M Is this ok [y/N]: y
Samotné stažení, rozbalení a nastavení balíčků:
Downloading Packages: (1/12): python3-backcall-0.1.0-11.fc33.noarch.r 453 kB/s | 27 kB 00:00 (2/12): python3-ipython_genutils-0.1.0-23.fc33. 700 kB/s | 51 kB 00:00 (3/12): python3-ipython-7.18.1-1.fc33.noarch.rp 8.9 MB/s | 800 kB 00:00 (4/12): python3-parso-0.7.0-2.fc33.noarch.rpm 4.1 MB/s | 147 kB 00:00 (5/12): python3-pickleshare-0.7.5-4.fc33.noarch 1.6 MB/s | 18 kB 00:00 (6/12): python3-pexpect-4.8.0-5.fc33.noarch.rpm 4.0 MB/s | 134 kB 00:00 (7/12): python3-jedi-0.17.1-2.fc33.noarch.rpm 15 MB/s | 1.0 MB 00:00 (8/12): python3-ptyprocess-0.6.0-11.fc33.noarch 1.5 MB/s | 30 kB 00:00 (9/12): python3-wcwidth-0.2.5-2.fc33.noarch.rpm 2.1 MB/s | 42 kB 00:00 (10/12): python3-traitlets-4.3.3-4.fc33.noarch. 4.8 MB/s | 159 kB 00:00 (11/12): python3-prompt-toolkit-3.0.5-4.fc33.no 12 MB/s | 576 kB 00:00 (12/12): python3-pygments-2.6.1-5.fc33.noarch.r 11 MB/s | 1.8 MB 00:00 -------------------------------------------------------------------------------- Total 5.4 MB/s | 4.8 MB 00:00 Running transaction check Transaction check succeeded. Running transaction test Transaction test succeeded. Running transaction Preparing : 1/1 ... ... ... Installed: python3-backcall-0.1.0-11.fc33.noarch python3-ipython-7.18.1-1.fc33.noarch python3-ipython_genutils-0.1.0-23.fc33.noarch python3-jedi-0.17.1-2.fc33.noarch python3-parso-0.7.0-2.fc33.noarch python3-pexpect-4.8.0-5.fc33.noarch python3-pickleshare-0.7.5-4.fc33.noarch python3-prompt-toolkit-3.0.5-4.fc33.noarch python3-ptyprocess-0.6.0-11.fc33.noarch python3-pygments-2.6.1-5.fc33.noarch python3-traitlets-4.3.3-4.fc33.noarch python3-wcwidth-0.2.5-2.fc33.noarch Complete!
Obrázek 3: Průběh instalace.
Obrázek 4: Dokončení instalace.
Podobně je tomu i v Mintu (a dalších distribucích odvozených z Ubuntu):
$ sudo apt-get install ipython3
Začátek instalace:
Reading package lists... Done Building dependency tree Reading state information... Done The following additional packages will be installed: python3-backcall python3-decorator python3-ipython python3-ipython-genutils python3-jedi python3-parso python3-pickleshare python3-prompt-toolkit python3-pygments python3-traitlets python3-wcwidth Suggested packages: python-ipython-doc python-pygments-doc ttf-bitstream-vera The following NEW packages will be installed: ipython3 python3-backcall python3-decorator python3-ipython python3-ipython-genutils python3-jedi python3-parso python3-pickleshare python3-prompt-toolkit python3-pygments python3-traitlets python3-wcwidth 0 upgraded, 12 newly installed, 0 to remove and 400 not upgraded. Need to get 1 990 kB of archives. After this operation, 12,1 MB of additional disk space will be used. Do you want to continue? [Y/n]
Samotné stažení, rozbalení a nastavení balíčků:
Get:1 http://archive.ubuntu.com/ubuntu focal/universe amd64 python3-backcall all 0.1.0-2 [11,2 kB] Get:2 http://archive.ubuntu.com/ubuntu focal/main amd64 python3-decorator all 4.4.2-0ubuntu1 [10,3 kB] Setting up python3-traitlets (4.3.3-3) ... Setting up python3-prompt-toolkit (2.0.10-2) ... Setting up python3-jedi (0.15.2-1) ... Setting up python3-ipython (7.13.0-1) ... Setting up ipython3 (7.13.0-1) ... Processing triggers for man-db (2.9.1-1) ...
Po instalaci se přesvědčte, že je nainstalována správná varianta:
$ ipython --version 7.18.1
3. První seznámení s IPythonem
Prostředí IPythonu se spouští příkazem ipython, popř. ipython3. Po spuštění proběhne inicializace, která může v závislosti na nastavení a počtu použitých pluginů trvat několik sekund. Poté se zobrazí výzva (prompt), která se ovšem liší od klasické výzvy interpretru Pythonu (obsahuje číslo buňky):
$ ipython Python 3.9.1 (default, Jan 20 2021, 00:00:00) Type 'copyright', 'credits' or 'license' for more information IPython 7.18.1 -- An enhanced Interactive Python. Type '?' for help. In [1]:
Obrázek 5: Prostředí IPythonu.
Příkazem ? je možné si nechat zobrazit obsah vestavěné nápovědy:
Obrázek 6: Vestavěná nápověda IPythonu.
Z nově dostupných funkcí je zajímavé a užitečné především automatické doplňování jmen funkcí, metod, proměnných. To však není vše, protože klávesou TAB, která automatické doplňování spouští, lze například zapisovat znaky z Unicode. Příklad je uveden na další dvojici screenshotů:
Obrázek 7: Po zápisu tohoto textu a stlačení klávesy TAB…
Obrázek 8: … se provede převod na příslušný znak z Unicode.
Dostupné jsou i další funkce, které budou podrobněji popsané v navazujících kapitolách:
- introspekce
- zobrazení dokumentace, popř. zdrojového kódu k libovolnému objektu
- práce s historií příkazů i jejich výsledků
- zvýraznění syntaxe
- chytré odsazování
- kouzelné (magic) funkce
- makra
- spouštění příkazů shellu
- spouštění příkazů určených pro jiné interpretry (Ruby atd.)
- zavolání externího editoru
- uložení, popř. zpětné načtení zdrojových kódů
- uložení, popř. zpětné načtení proměnných
4. Volba způsobu ovládání IPythonu
Interaktivní prostředí IPythonu je možné ovládat dvěma prakticky zcela rozdílnými způsoby – buď se používají klávesové zkratky převzaté z velké části z Emacsu (tedy takové zkratky, které jsou výchozí i v BASHi), nebo se naopak mohou použít klávesové zkratky inspirované konkurenčními textovými editory Vi a Vim. Starší verze IPythonu byly založeny na knihovně GNU Readline (a rozhraní pro Python nazvané readline), o níž se můžete dozvědět více informací například přímo na stránkách této knihovny. Tomu taktéž odpovídá použití konfiguračního souboru .inputrc s nastavením způsobu ovládání, který může v případě, že preferujete klávesové zkratky Vimu, vypadat následovně:
set editing-mode vi set keymap vi-command
Ovšem naproti tomu nové verze IPythonu jsou postaveny na knihovně pojmenované Prompt Toolkit, s níž jsme se již na stránkách Rootu seznámili v trojici článků [1] [2] [3] a [4]. Tato knihovna přináší nové možnosti, například zobrazení kontextových menu apod.
Opět platí, že výchozí způsob ovládání je do jisté míry převzat z Emacsu. Pro přepnutí do druhého režimu poslouží následující volba zadávaná při spouštění IPythonu z příkazového řádku:
$ ipython --TerminalInteractiveShell.editing_mode=vi
Ovšem toto nastavení je pouze dočasné. Pokud budete chtít IPython ovládat ve stylu Vimu po každém spuštění, je nutné nejdříve vytvořit takzvaný profil, a to konkrétně příkazem:
$ ipython profile create [ProfileCreate] Generating default config file: '/home/tester/.ipython/profile_default/ipython_config.py'
Následně se v právě vytvořeném souboru „~/.ipython/profile_default/ipython_config.py“ provede tato úprava:
c.TerminalInteractiveShell.editing_mode = 'vi'
Obrázek 9: V režimu Vi/Vim je možné před editační příkazy zadávat počet opakování, který se zobrazí i v textovém uživatelském rozhraní IPythonu. Navíc se zobrazuje i to, zda je aktivní režim vkládání znaků či režim editační/navigační.
5. Standardní klávesové zkratky v režimu emulace Emacsu
V této kapitole jsou vypsány vybrané klávesové zkratky, které jsou ve výchozím nastavení použity IPythonem při nastavení režimu napodobujícího ovládání Emacsu. Zkratky jsou podle své funkce rozděleny do několika kategorií.
Příkazy pro přesuny kurzoru
Základní příkazy pro přesun kurzoru používají kombinaci Ctrl+znak, Alt+znak, popř. alternativně Esc znak v případě, že zkratky Alt+znak kolidují s emulátorem terminálu (například vyvolávají příkazy z menu apod.). V případě, že je terminál správně nakonfigurován, měly by fungovat i kurzorové šipky a navíc i klávesy Home a End (se zřejmou funkcí):
Klávesa | Význam |
---|---|
Ctrl+B | přesun kurzoru na předchozí znak |
Ctrl+F | přesun kurzoru na další znak |
Alt+B | přesun kurzoru na předchozí slovo |
Alt+F | přesun kurzoru na následující slovo |
Esc, B | shodné s Alt+B |
Esc, F | shodné s Alt+F |
Ctrl+A | přesun kurzoru na začátek řádku |
Ctrl+E | přesun kurzoru na konec řádku |
Mazání textu, práce s kill ringem
Pro přesun části textu v rámci editovaného řádku se používá takzvaný kill ring, do něhož se smazaný text uloží. Pro vložení takto smazaného textu do jiné oblasti (tedy typicky na jiné místo na řádku) se používá operace nazvaná yank (odpovídá dnes běžnější operaci paste). Některé dále uvedené příkazy dokážou s kill ringem pracovat:
Klávesa | Význam |
---|---|
Ctrl+K | smaže text od pozice kurzoru do konce řádku a uloží ho do kill ringu |
Ctrl+U | smaže text od začátku řádku do pozice kurzoru a uloží ho do kill ringu |
Ctrl+W | smaže předchozí slovo a uloží ho do kill ringu |
Alt+D | smaže následující slovo a uloží ho do kill ringu |
Ctrl+Y | vloží text z kill ringu na místo, na němž se právě nachází kurzor (yank) |
Alt+Y | po operaci Ctrl+Y dokáže rotovat historií kill ringu a obnovit tak (před)předchozí smazaný text |
Ctrl+D | smaže jeden znak (pokud je ovšem na řádku nějaký obsah, jinak typicky ukončí aplikaci, v IPythonu má i další funkce) |
Práce s historií dříve zadaných příkazů
Velmi užitečné jsou příkazy, které dokážou vyvolat již jednou zadané příkazy ze zapamatované historie příkazů:
Klávesa | Význam |
---|---|
Ctrl+P | průchod historií – předchozí text (lze použít i šipku nahoru) |
Ctrl+N | průchod historií – následující text (lze použít i šipku dolů) |
Ctrl+R | zpětné (interaktivní) vyhledávání v historii |
Ctrl+G | ukončení režimu vyhledávání |
Některé další dostupné příkazy
Klávesa | Význam |
---|---|
Tab | implicitní klávesa pro zavolání completeru (viz další text) |
Ctrl+T | prohození dvou znaků (před kurzorem a na pozici kurzoru, častý překlep) |
Alt+U | text od pozice kurzoru do konce slova se změní NA VERZÁLKY |
Alt+L | text od pozice kurzoru do konce slova se změní na mínusky |
Alt+C | text od pozice kurzoru do konce slova se změní Tak, Že Slova Začínají Velkým Písmenem |
6. Standardní klávesové zkratky v režimu emulace Vi/Vimu
V režimu emulace editorů Vi/Vim je možné mj. použít i tyto klávesové zkratky:
Příkazy pro přesuny kurzoru
Tyto příkazy jsou platné pro normální režim a lze je zkombinovat s operátory (delete, change, yank atd.):
Klávesa | Význam |
---|---|
h | přechod kurzoru na předchozí znak |
l | přechod kurzoru na další znak |
b | skok (zpět) na první znak slova |
e | skok na poslední znak slova |
w | skok na první znak následujícího slova |
0 | skok na začátek řádku |
$ | skok na konec řádku |
% | doskok na párovou závorku |
f | skok na specifikovaný znak (find) |
Editace textu
Klávesa | Význam |
---|---|
x | smazání jednoho znaku (odpovídá klávese Delete) |
d | operace smazání textu (musí být následována příkazem pro pohyb kurzoru) |
D | smazání textu od pozice kurzoru do konce řádku |
y | přenos textu do registru _ (musí být následována příkazem pro pohyb kurzoru) |
c | změna textu (musí být následována příkazem pro pohyb kurzoru) |
r | změna jediného znaku |
s | změna jediného znaku a přechod do vkládacího režimu |
p | operace put/paste, vloží smazaný text od pozice kurzoru |
P | operace put/paste, vloží smazaný text před pozicí kurzoru |
Příkazy ve vkládacím režimu
Některé příkazy ve vkládacím režimu odpovídají režimu Emacsu:
Klávesa | Význam |
---|---|
Ctrl+T | prohození dvou znaků (před kurzorem a na pozici kurzoru) |
Ctrl+H | smazání znaku nalevo od kurzoru (odpovídá Backspace) |
Ctrl+R | zpětné (interaktivní) vyhledávání v historii |
Ctrl+W | smaže předchozí slovo a uloží ho do kill ringu |
Ctrl+Y | vloží text z registru _ na místo, na němž se nachází kurzor (yank) |
Další příkazy
Klávesa | Význam |
---|---|
Esc | přepnutí do normálního režimu |
1–9 | prefix pro opakování další operace |
u | vrácení poslední operace (lze opakovat) |
a | append – přechod do režimu vkládání |
i | insert – přechod do režimu vkládání |
~ | změna jednoho znaku: verzálky/kapitálky a zpět |
k | průchod historií – předchozí text |
j | průchod historií – následující text |
7. Vstupní řádek a koncept buněk
Pokud porovnáme vzhled prostředí standardního interpretru Pythonu a IPythonu, uvidíme jeden zásadní rozdíl. Ten se týká způsobu zobrazení výzvy (prompt). Zatímco ve standardním interpretru Pythonu je výzva (podle kontextu) zobrazena formou >>> či …, v případě IPythonu se navíc ještě před místem, do kterého se provádí zápis, zobrazuje číslo. Jednotlivé vstupy jsou totiž považovány za buňky (cells), k jejichž obsahu je možné se později vracet. Navíc se rozlišuje mezi vstupem buněk a výslednou hodnotou. Ostatně koncept buněk byl později ještě více rozšířen v Jupyter Notebooku, v němž se buňky (resp. jejich čísla) zobrazují podobným způsobem, i když většinou ve webovém grafickém uživatelském rozhraní:
Obrázek 10: Prostředí standardního interpretru Pythonu.
Obrázek 11: Prostředí IPythonu.
8. Historie zadávaných příkazů a jejich výsledků
Jak jsme si již naznačili v předchozí kapitole, dovoluje nám koncept očíslovaných buněk přistupovat k historii dříve zadaných příkazů a dokonce i jejich výsledků. Poslední tři příkazy jsou dostupné v proměnných pojmenovaných _i, _ii a _iii (typ proměnných je pochopitelně řetězec). Pokud je zapotřebí přistoupit ke konkrétnímu vstupu (příkazu) na základě jeho čísla, je možné použít zápis _ičíslo, například:
In [47]: 6*7 Out[47]: 42 In [48]: _i47 Out[48]: '6*7'
Existují ovšem i další způsoby práce s historií příkazů a jejich výsledků. Vstupní (uživatelem zapisované) příkazy jsou uloženy v seznamu _ih, popř. v seznamu In. A nic nám nebrání v přístupu k prvkům těchto seznamů:
In [50]: _ih[47] Out[50]: '6*7' In [51]: In[47] Out[51]: '6*7'
Podobným způsobem je umožněno přistupovat k výsledkům příkazů. Ty jsou ukládány v seznamech _oh a Out, přičemž každý výsledek má korektní typ (obecně se tedy nejedná o pouhé řetězce):
In [55]: _oh[47] Out[55]: 42 In [56]: Out[47] Out[56]: 42
Výsledky je tedy možné použít při výpočtech atd.:
In [17]: 1+2 Out[17]: 3 In [18]: 6*7 Out[18]: 42 In [19]: Out[17] + Out[18] Out[19]: 45 In [20]: Out[18] / Out[17] Out[20]: 14.0
V některých případech mohou uživatelé požadovat, aby se výsledek nějakého příkazu nezobrazil, tj. aby se příkaz pouze provedl. I to je možné – za příkaz je ovšem v tomto případě nutné vložit znak středníku:
In [59]: 1+2; In [60]: 1+2 Out[60]: 3
Obrázek 12: Některé možnosti práce s historií výsledků příkazů.
9. Automatické odsazování zapisovaného kódu
IPython správně rozezná začátky vnořeného bloku, což ostatně (alespoň většinou) není nic složitého, protože se pro označení začátku bloku používá znak dvojtečky. Jakmile je zahájen zápis celého bloku, například definice funkce nebo třídy, bude celý tento vstup součástí jediné buňky. Ovšem nejenom to – po stisku klávesy Enter se správně provede odsazení, které tak není nutné zapisovat ručně, na rozdíl od standardní interaktivní smyčky programovacího jazyka Python. Dvojí stisk klávesy Enter (tedy vlastně pokus o vložení prázdného řádku) ukončí vstup a tím i celou buňku. Jediným místem, na němž je nutné s odsazením kódu pracovat ručně, je ukončení vnitřního bloku – tehdy je nutné automaticky vložené odsazení odmazat:
Obrázek 13: Automatické odsazování kódu přímo zapisovaného do buňky IPythonu.
10. Doplňování názvů funkcí, metod a proměnných
Prostředí IPythonu se snaží o kontextové doplnění názvů funkcí, metod, proměnných, kouzelných funkcí atd. K vyvolání menu s nabídkou názvů, které mají v daném kontextu význam, slouží klávesa Tab, a to nezávisle na zvoleném způsobu ovládání IPythonu. Na následující pětici screenshotů jsou některé možnosti kontextového doplňování ukázány:
Obrázek 14: Nabídka názvů globálně dostupných objektů, které začínají na „de“.
Obrázek 15: Zde je nabídka omezena pouze na nainstalované balíčky začínající na „o“.
Obrázek 16: Objekty, které jsou přímo dostupné z balíčku os.
Obrázek 17: Omezení pouze na ty objekty, které začínají na „c“.
Obrázek 18: Kontextové doplnění pracuje i pro uživatelem vytvořené objekty.
11. Introspekce: zobrazení informací o vybraném objektu
Další důležitou vlastností IPythonu je podpora introspekce. O každém (pojmenovaném) objektu je totiž možné zjistit jak základní informace, tak si popř. nechat zobrazit i jeho zdrojový kód (pokud se ovšem nejedná o vestavěnou funkci atd.). Pro získání informací o nějakém objektu se před nebo za název tohoto objektu zapisuje otazník:
var?
?var
Pro výpis zdrojového kódu nebo podrobnějších informací se používá dvojice otazníků:
var??
??var
Příklady použití:
In [9]: os.chdir? Signature: os.chdir(path) Docstring: Change the current working directory to the specified path. path may always be specified as a string. On some platforms, path may also be specified as an open file descriptor. If this functionality is unavailable, using it raises an exception. Type: builtin_function_or_method
Popř.:
In [26]: import math In [27]: math.floor? Signature: math.floor(x, /) Docstring: Return the floor of x as an Integral. This is the largest integer <= x. Type: builtin_function_or_method In [33]: math? Type: module String form: <module 'math' from '/usr/lib64/python3.9/lib-dynload/math.cpython-39-x86_64-linux-gnu.so'> File: /usr/lib64/python3.9/lib-dynload/math.cpython-39-x86_64-linux-gnu.so Docstring: This module provides access to the mathematical functions defined by the C standard.
Získat lze i seznam objektů, které ve svém názvu obsahují určitý podřetězec. Pokud tedy například hledáte funkce pro práci s adresáři, lze použít tečkovou konvenci:
In [6]: import os In [7]: os.*dir*? os.__dir__ os.chdir os.curdir os.fchdir os.listdir os.makedirs os.mkdir os.pardir os.removedirs os.rmdir os.scandir os.supports_dir_fd
Prozkoumat je možné i výše zmíněné seznamy se zadanými příkazy i jejich výsledky:
In [49]: _i47? Type: str String form: 6*7 Length: 3 Docstring: str(object='') -> str str(bytes_or_buffer[, encoding[, errors]]) -> str Create a new string object from the given object. If encoding or errors is specified, then the object must expose a data buffer that will be decoded using the given encoding and error handler. Otherwise, returns the result of object.__str__() (if defined) or repr(object). encoding defaults to sys.getdefaultencoding(). errors defaults to 'strict'.
Obrázek 19: Ukázka introspekce v IPythonu.
Obrázek 20: Ukázka introspekce v IPythonu.
12. Spuštění příkazů shellu
Tato kapitola bude jen velmi stručná, protože si v ní popíšeme funkci jediného znaku !. Ten slouží pro zavolání libovolného příkazu shellu, ať již vestavěného nebo externího:
!ls
Další příklad použití je uveden na screenshotu:
Obrázek 21: Spuštění příkazu shellu přímo z prostředí IPythonu.
13. Kouzelné funkce IPythonu
V IPythonu se mnoho operací vykonává s využitím takzvaných kouzelných (neboli magických) funkcí, které ovšem nemají nic společného s magickými metodami tříd. Magické funkce začínají znakem % nebo %% a při jejich volání se nepoužívají závorky. Popis všech kouzelných funkcí lze pochopitelně nalézt ve vestavěné nápovědě:
Obrázek 22: Nápověda ke kouzelným funkcím IPythonu.
Nápověda obsahuje seznam těchto funkcí se stručným popisem:
The following magic functions are currently available: %alias: Define an alias for a system command. %alias_magic: :: %autoawait: %autocall: Make functions callable without having to type parentheses. %autoindent: Toggle autoindent on/off (deprecated) %automagic: Make magic functions callable without having to type the initial %. %bookmark: Manage IPython's bookmark system. %cat: Alias for `!cat` %cd: Change the current working directory. %clear: Alias for `!clear` %colors: Switch color scheme for prompts, info system and exception handlers.
Kromě toho je ovšem možné si zobrazit nápovědu ke konkrétní vybrané funkci, opět s využitím otazníku:
In [73]: %colors? Docstring: Switch color scheme for prompts, info system and exception handlers. Currently implemented schemes: NoColor, Linux, LightBG. Color scheme names are not case-sensitive. Examples -------- To get a plain black and white terminal:: %colors nocolor File: /usr/lib/python3.9/site-packages/IPython/core/magics/basic.py
14. Kouzelné funkce %cpaste a %edit
Editace delších částí zdrojových kódů přímo v IPythonu, tedy na úrovni jednotlivých buněk, není ideální, protože nám mohou chybět pokročilejší funkce programátorských textových editorů. Ovšem díky existenci kouzelných funkcí %cpaste a %edit lze do IPythonu buď přenést celý blok přes schránku (bez snahy o jeho přeformátování), popř. spustit externí editor a upravit v něm zvolenou část kódu. Výběr textového editoru se provádí přes proměnné prostředí $EDITOR, popř. $VISUAL. Nejprve se podívejme na funkci %cpaste. Tu použijeme v případě, že již máme ve schránce naformátovaný zdrojový text:
Obrázek 23: Použití kouzelné funkce %cpaste.
Vkládání se ukončuje klávesovou zkratkou Ctr+D.
Kouzelná funkce %edit (lze ji vyvolat i přes F2) nám umožní spustit editor s možností úpravy vybraného objektu či vytvoření objektu nového:
%edit %edit filename %edit funkce %edit proměnná
Některé další možnosti poskytované touto kouzelnou funkcí jsou vypsány v nápovědě:
Obrázek 24: Nápověda ke kouzelné funkci %edit.
15. Načtení, uložení a zveřejnění zdrojových kódů
Pro načtení souboru se zdrojovými kódy se používá kouzelná funkce nazvaná %load:
Obrázek 25: Nápověda ke kouzelné funkci %load.
Pro opačnou operaci, tedy pro uložení obsahu vybraných buněk slouží kouzelná funkce se jménem %save. Té se předává jak jméno souboru, tak i buňky, které se do něho mají uložit:
In [7]: %save test 1-5 The following commands were written to file `test.py`: get_ipython().run_line_magic('store', '') get_ipython().run_line_magic('pinfo', '%store') get_ipython().run_line_magic('pinfo', '%save') get_ipython().run_line_magic('pinfo', '%load') get_ipython().run_line_magic('save', '')
Obsah tohoto souboru vypadá následovně:
$ cat test.py # coding: utf-8 get_ipython().run_line_magic('store', '') get_ipython().run_line_magic('pinfo', '%store') get_ipython().run_line_magic('pinfo', '%save') get_ipython().run_line_magic('pinfo', '%load') get_ipython().run_line_magic('save', '')
$ ipython Python 3.9.1 (default, Jan 20 2021, 00:00:00) Type 'copyright', 'credits' or 'license' for more information IPython 7.18.1 -- An enhanced Interactive Python. Type '?' for help. In [1]: load test.py In [2]: # %load test.py ...: get_ipython().run_line_magic('store', '') ...: get_ipython().run_line_magic('pinfo', '%store') ...: get_ipython().run_line_magic('pinfo', '%save') ...: get_ipython().run_line_magic('pinfo', '%load') ...: get_ipython().run_line_magic('save', '') ...:
Historie příkazů (tedy buněk), které lze uložit, lze přečíst kouzelnou funkcí %history:
Obrázek 26: Historie příkazů.
Mezi další užitečné kouzelné funkce patří %pastebin, která zveřejní kód na http://dpaste.com/:
In [4]: %pastebin 1-4 Out[4]: 'http://dpaste.com/GB9YHSEF9'
16. Databáze s historií spouštěných příkazů
Příkazy zadávané do interaktivního prostředí IPythonu jsou na pozadí ukládány do databáze s využitím známého databázového engine SQLite. Obsah této databáze si můžeme snadno prohlédnout, protože pro každý vytvořený profil (a výchozí profil by měl existovat vždy) je vytvořen nový soubor:
$ sqlite3 ~/.ipython/profile_default/history.sqlite SQLite version 3.34.1 2021-01-20 14:10:07 Enter ".help" for usage hints.
Existovat by měly minimálně tři tabulky:
sqlite& .tables history output_history sessions
Tabulka sessions obsahuje informace o jednotlivých sezeních:
sqlite& .schema sessions CREATE TABLE sessions (session integer primary key autoincrement, start timestamp, end timestamp, num_cmds integer, remark text);
Tabulka s historií obsahuje jednotlivé příkazy vázané na sezení:
sqlite& .schema history CREATE TABLE history (session integer, line integer, source text, source_raw text, PRIMARY KEY (session, line));
A konečně třetí tabulka obsahuje výstupní hodnoty jednotlivých příkazů, opět navázané na sezení:
sqlite& .schema output_history CREATE TABLE output_history (session integer, line integer, output text, PRIMARY KEY (session, line));
Jednotlivá sezení si můžeme snadno vypsat:
sqlite& select * from sessions; 1|2021-02-16 14:13:12.966734|2021-02-16 14:13:18.542516|0| 2|2021-02-16 14:13:21.963139|2021-02-16 14:22:48.566057|2| 3|2021-02-16 15:15:56.297348|2021-02-16 15:21:29.017774|1| 4|2021-02-16 15:21:30.652580|2021-02-16 15:22:44.910039|0| 5|2021-02-16 15:22:48.445362|2021-02-16 15:28:18.674137|0| 6|2021-02-16 17:46:30.920573|2021-02-16 18:32:23.949748|77| 7|2021-02-16 18:32:25.506659|2021-02-17 09:54:32.862249|1|
Stejně tak si můžeme vypsat historii zadávaných příkazů:
sqlite& select * from history limit 10; 2|1|get_ipython().show_usage()|? 2|2|get_ipython().run_line_magic('edit', 'test')|edit test 3|1|get_ipython().show_usage()|? 6|1|os.*dir*|os.*dir* 6|2|get_ipython().run_line_magic('psearch', 'os.*dir*')|os.*dir*? 6|3|import os|import os 6|4|os.*dir*|os.*dir* 6|5|get_ipython().run_line_magic('psearch', 'os.*dir*')|os.*dir*? 6|6|import os|import os 6|7|get_ipython().run_line_magic('psearch', 'os.*dir*')|os.*dir*?
17. Vybrané „konkurenční“ projekty
18. Projekty bpython, ptpython a dreampie
První z těchto projektů se jmenuje bpython a nabízí uživatelům mj. i tyto možnosti, které v původním interpretru nenajdeme. Mezi tyto možnosti patří zejména:
- Zvýraznění syntaxe přímo při zápisu jednotlivých řádků, které se mají interaktivně spustit. Pro tento účel se používá knihovna Pygments.
- Plná podpora pro editaci prováděnou v rámci příkazového řádku založená na běžných a často používaných zkratkách převzatých z Emacsu.
- Automatické odsazení řádků, které se nachází uvnitř smyček, podmínek, deklarací funkcí, deklarací tříd atd.
- Možnost zápisu příkazů a deklarací v textovém editoru.
- Zobrazení seznamu klíčových slov a funkcí začínajících již zapsaným prefixem (v tomto případě bez nutnosti použití klávesové zkratky).
- Automatické doplnění klíčového slova či funkce s využitím klávesyTab ze zobrazené nabídky.
- Zobrazení nápovědy s parametry volané funkce nebo metody ihned po zápisu otevírací závorky.
- Samozřejmě je podporován i Python 3.x (což už by dnes měl být standard).
- Dále tento projekt nabízí možnost získat historii zapsaných příkazů a znovu je zavolat, popř. je nějakým způsobem modifikovat.
- Užitečná je i další vlastnost – automatické poslání části zapsaného kódu do služby typu „pastebin“, takže lze velmi snadno kód nasdílet s kolegy (což samozřejmě nijak nenahrazuje plnohodnotný systém pro správu verzí :-).
- A samozřejmě je možné zapsaný a otestovaný kód uložit do souboru pro jeho další znovupoužití.
Obrázek 27: Takto vypadá základní uživatelské rozhraní projektu bpython.
Obrázek 28: Velmi užitečná vlastnost – po stisku klávesy F7 se spustí vybraný textový editor, do něhož je možné zapsat libovolnou deklaraci či příkaz(y), které se po ukončení editoru automaticky provedou.
Obrázek 29: Návrat z textového editoru zpět do prostředí REPLu. Vytvořený text se automaticky vložil do interpretru.
Druhý projekt, s nímž se v dnešním článku ve stručnosti seznámíme, se jmenuje ptpython. Kromě toho, že jméno projektu začíná iniciálami autora článku :-) se jedná o zajímavé a užitečné rozšíření možností původního interpretru Pythonu o tyto vlastnosti:
- Ve spodní části terminálu je zobrazena stavová řádka, která kontextově mění svůj obsah.
- Podporováno je zvýrazňování syntaxe zapisovaných příkazů a deklarací. I v tomto případě se pro tyto účely využívá knihovna Pygments.
- Dále tento projekt používá knihovnu Jedi, která (mimo jiné) umožňuje zobrazení kontextových menu s nabídkou metod pro zapsané jméno objektu.
- Stejná knihovna (Jedi) je použita pro doplnění klíčových slov, jmen funkcí, názvů metod apod.
- Ve výchozím nastavení je umožněna plnohodnotná editace příkazového řádku s využitím klávesových zkratek odvozených od textového editoru Emacs (a používaných v mnoha dalších shellech, například v BASHi, pokud ho nepřepneme do jiného režimu).
- V Emacs režimu se na stavové řádce zobrazují některé dostupné příkazy (například při stisku Ctrl+Space pro práci s výběrem).
- Klávesovou zkratkou F4 se můžeme prakticky kdykoli přepnout do režimu emulujícího chování modálních editorů Vi a Vim. Podporovány jsou prakticky všechny základní editační příkazy.
- Podporován je i záznam maker s jejich pozdějším přehráváním. V režimu Vi/Vim se záznam spustí zkratkou q_písmeno_, přehrání makra pak zkratkou @_písmeno.
- Existuje i speciální režim pro vkládání textu přes schránku a podpora pro práci s myší (ovšem podle toho, zda terminál práci s myší umožňuje).
- Stiskem klávesy F2 se zobrazí přehledný konfigurační dialog.
- Při vyhledávání v historii příkazů přes Ctrl+R se zobrazí všechny nalezené shody.
- Barvová schémata jsou konfigurovatelná.
Obrázek 30: Prostředí projektu ihned po spuštění. Povšimněte si stavového řádku, na němž se mj. zobrazuje i zvolený režim, v tomto případě režim EMACSu.
Obrázek 31: Klávesovou zkratkou F4 se můžeme přepnout do režimu emulujícího chování editoru Vi/Vim. Z vkládacího režimu se klávesou Esc přepneme do režimu normálního se všemi základními editačními příkazy i příkazy pro pohyb kurzoru. Klávesou v se otevře vybraný externí editor, do něhož bude možné zapsat složitější deklarace.
Obrázek 32: Po stisku klávesy F2 se zobrazí menu/dialog pro nastavení všech vlastností projektu ptpython. Pohyb a změna hodnot se provádí kurzorovými klávesami, potvrzení pak klávesou Enter.
Třetí potenciálně zajímavý projekt se jmenuje DreamPie. Tento projekt se od výše popsaných projektů bpython a ptpython odlišuje především tím, že používá vlastní implementaci terminálu a podporuje některé prvky využívající grafické uživatelské rozhraní. Toto řešení pochopitelně má svoje výhody, ale i nevýhody. Mezi nevýhody patří větší závislost na systémových knihovnách (GTK, GObject, nová verze by ovšem měla používat Tkinter), mezi výhody pak například možnost dobré spolupráce s Matplotlibem a dalšími podobně koncipovanými knihovnami. Dalším potenciálním problémem je fakt, že je DreamPie naprogramovaný v Pythonu 2, takže budete potřebovat i tento interpret a jeho knihovny (to může být do budoucna problematické).
Samotné uživatelské prostředí projektu DreamPie používá okno terminálu, které je rozděleno na dvě části. V horní části se nachází historie zapsaných a spuštěných příkazů, v části dolní pak vstupní oblast, do které uživatel může zapisovat nové příkazy a provádět další operace. Zapsané příkazy je možné označit a později uložit do souboru pro další použití. Zajímavá a užitečná je i možnost složení (fold) deklarace funkcí, metod či celých tříd, což vede k úspoře plochy obrazovky (samotné složení je možné provést ručně nebo automaticky).
Podobně jako u projektu ptpython je i zde podporováno automatické doplňování kódu, automatické doplňování jmen souborů, automatické dopsání párových závorek, uvozovek atd. Dokonce je možné namísto zápisu:
len("xyzzy")
zapsat pouze:
len xyzzy
a nechat interaktivní prostředí, aby automaticky doplnilo jak závorky, tak i uvozovky.
Obrázek 33: Projekt DreamPie dokáže používat svá vlastní GUI okna, což je současně výhoda, ale i nevýhoda tohoto projektu.
Obrázek 34: Jeden z důvodů, proč je DreamPie založen na Pythonu 2.
Obrázek 35: Dialog s nastavením chování interaktivního prostředí.
Obrázek 36: Rozdělení okna terminálu na část s historií příkazů (i s výsledky) a na část, do níž se příkazy zapisují.
19. Obsah druhé části článku
V navazujícím článku se zaměříme na popis dalších užitečných magických funkcí. Popíšeme si i možnost přidání vlastních kouzelných funkcí, využití takzvaných kernelů a kombinaci IPythonu s programátorskými textovými editory, popř. s integrovanými vývojovými prostředími.
20. Odkazy na Internetu
- Domovská stránka projektu IPython
https://ipython.org/ - IPython (Wikipedia)
https://en.wikipedia.org/wiki/IPython - Projekt IPython na PyPi
https://pypi.org/project/ipython/ - Dokumentace k IPythonu
http://ipython.org/documentation.html# - IPython Documentation (na ReadTheDocs)
https://ipython.readthedocs.io/en/stable/ - IPython Tutorial
http://ipython.readthedocs.org/en/stable/interactive/tutorial.html - IPython Tips & Tricks
https://ipython.readthedocs.io/en/stable/interactive/tips.html - IPython cookbook
https://github.com/ipython/ipython/wiki?path=Cookbook - Cookbook: Index
https://github.com/ipython/ipython/wiki/Cookbook%3A-Index - Projects using IPython
https://github.com/ipython/ipython/wiki/Projects-using-IPython - Sebastian Witowski – Wait, IPython can do that?!
https://www.youtube.com/watch?v=3i6db5zX3Rw - vim-ipython
https://github.com/ivanov/vim-ipython - IPython Frequently asked questions
https://github.com/ipython/ipython/wiki/Frequently-asked-questions - What is REPL?
https://pythonprogramminglanguage.com/repl/ - What is a REPL?
https://codewith.mu/en/tutorials/1.0/repl - Programming at the REPL: Introduction
https://clojure.org/guides/repl/introduction - What is REPL? (Quora)
https://www.quora.com/What-is-REPL - Gorilla REPL: interaktivní prostředí pro programovací jazyk Clojure
https://www.root.cz/clanky/gorilla-repl-interaktivni-prostredi-pro-programovaci-jazyk-clojure/ - Read-eval-print loop (Wikipedia)
https://en.wikipedia.org/wiki/Read%E2%80%93eval%E2%80%93print_loop - Domovská stránka programovacího jazyka Python
https://www.python.org/ - Domovská stránka projektu bpython
https://bpython-interpreter.org/ - Projekt bpython na PyPi
https://pypi.org/project/bpython/ - Git repositář projektu bpython
https://github.com/bpython/bpython - Projekt ptpython na PyPi
https://pypi.org/project/ptpython/ - Git repositář projektu ptpython
https://github.com/prompt-toolkit/ptpython - Domovská stránka projektu DreamPie
http://www.dreampie.org/ - Projekt DreamPie na PyPi
https://pypi.org/project/dreampie/ - Git repositář projektu DreamPie
https://github.com/noamraph/dreampie - Integrovaná vývojová prostředí ve Fedoře: IPython a IPython Notebook
http://mojefedora.cz/integrovana-vyvojova-prostredi-ve-fedore-ipython-a-ipython-notebook/ - Integrovaná vývojová prostředí ve Fedoře: praktické použití IPython Notebooku a knihovny Numpy
http://mojefedora.cz/integrovana-vyvojova-prostredi-ve-fedore-prakticke-pouziti-ipython-notebooku-a-knihovny-numpy/ - Integrovaná vývojová prostředí ve Fedoře: praktické použití IPython Notebooku a knihovny Numpy (2.část)
http://mojefedora.cz/integrovana-vyvojova-prostredi-ve-fedore-prakticke-pouziti-ipython-notebooku-a-knihovny-numpy-2-cast/ - Integrovaná vývojová prostředí ve Fedoře: vykreslování grafů s využitím knihoven Numpy a matplotlib
http://mojefedora.cz/integrovana-vyvojova-prostredi-ve-fedore-vykreslovani-grafu-s-vyuzitim-knihoven-numpy-a-matplotlib/ - Integrovaná vývojová prostředí ve Fedoře: vykreslování grafů s využitím knihoven Numpy a matplotlib (2.část)
http://mojefedora.cz/integrovana-vyvojova-prostredi-ve-fedore-vykreslovani-grafu-s-vyuzitim-knihoven-numpy-a-matplotlib-2-cast/ - Is IPython Notebook ever used as an IDE, or merely for presentations?
https://www.reddit.com/r/IPython/comments/1uk7hp/is_ipython_notebook_ever_used_as_an_ide_or_merely/ - The IDE as a Bad Programming Language Enabler
https://dzone.com/articles/ide-bad-programming-language - Enhanced Interactive Python with IPython
http://www.onlamp.com/pub/a/python/2005/01/27/ipython.html - Příkazový řádek – přítel nejvěrnější
https://www.root.cz/clanky/prikazovy-radek-pritel-nejvernejsi/ - Příkazový řádek – přítel nejvěrnější (2)
https://www.root.cz/clanky/prikazovy-radek-pritel-nejvernejsi-2/ - Picking a Python Interpreter (3 vs 2)
https://docs.python-guide.org/starting/which-python/ - Využití knihovny Pygments (nejenom) pro obarvení zdrojových kódů
https://www.root.cz/clanky/vyuziti-knihovny-pygments-nejenom-pro-obarveni-zdrojovych-kodu/ - Využití knihovny Pygments (nejenom) pro obarvení zdrojových kódů: vlastní filtry a lexery
https://www.root.cz/clanky/vyuziti-knihovny-pygments-nejenom-pro-obarveni-zdrojovych-kodu-vlastni-filtry-a-lexery/ - Knihovna Jedi: doplňování kódu a statická analýza kódu v Pythonu
https://www.root.cz/clanky/knihovna-jedi-doplnovani-kodu-a-staticka-analyza-kodu-v-pythonu/ - Knihovna Jedi: doplňování kódu a statická analýza kódu v Pythonu (dokončení)
https://www.root.cz/clanky/knihovna-jedi-doplnovani-kodu-a-staticka-analyza-kodu-v-pythonu-dokonceni/ - Pygments – Python syntax highlighter
http://pygments.org/ - Pygments (dokumentace)
http://pygments.org/docs/ - Write your own lexer
http://pygments.org/docs/lexerdevelopment/ - Jazyky podporované knihovnou Pygments
http://pygments.org/languages/ - Pygments FAQ
http://pygments.org/faq/ - Pygments 2.2.0 (na PyPi)
https://pypi.org/project/Pygments/ - Syntax highlighting
https://en.wikipedia.org/wiki/Syntax_highlighting - Jedi – an awesome autocompletion/static analysis library for Python
https://jedi.readthedocs.io/en/latest/index.html - Jedi API Overview
https://jedi.readthedocs.io/en/latest/docs/api.html - jedi-vim
https://github.com/davidhalter/jedi-vim - Tvorba textového rozhraní s knihovnou prompt_toolkit: základní prvky TUI
https://www.root.cz/clanky/tvorba-textoveho-rozhrani-s-knihovnou-prompt-toolkit-zakladni-prvky-tui/ - Tvorba TUI s knihovnou prompt_toolkit: aplikace s celoobrazovkovým rozhraním
https://www.root.cz/clanky/tvorba-tui-s-knihovnou-prompt-toolkit-aplikace-s-celoobrazovkovym-rozhranim/ - Tvorba textového uživatelského rozhraní s knihovnou prompt_toolkit: ovládací prvky (widgety)
https://www.root.cz/clanky/tvorba-textoveho-uzivatelskeho-rozhrani-s-knihovnou-prompt-toolkit-ovladaci-prvky-widgety/ - ØMQ: knihovna pro asynchronní předávání zpráv
https://www.root.cz/clanky/0mq-knihovna-pro-asynchronni-predavani-zprav/ - Další možnosti poskytované knihovnou ØMQ
https://www.root.cz/clanky/dalsi-moznosti-poskytovane-knihovnou-mq/ - What is the difference between Jupyter and IPython Notebook?
https://www.quora.com/What-is-the-difference-between-Jupyter-and-IPython-Notebook - Jupyter kernels
https://github.com/jupyter/jupyter/wiki/Jupyter-kernels - Keyboard Shortcuts in the IPython Shell
https://jakevdp.github.io/PythonDataScienceHandbook/01.02-shell-keyboard-shortcuts.html - New terminal interface
https://ipython.readthedocs.io/en/stable/whatsnew/version5.html#new-terminal-interface - prompt-toolkit
https://python-prompt-toolkit.readthedocs.io/en/stable/ - Tvorba aplikací s příkazovým řádkem v Pythonu s knihovnami GNU Readline a prompt_toolkit
https://www.root.cz/clanky/tvorba-aplikaci-s-prikazovym-radkem-v-pythonu-s-vyuzitim-knihoven-gnu-readline-a-prompt-toolkit/ - Tvorba aplikací s textovým uživatelským rozhraním založeným na knihovně prompt_toolkit
https://www.root.cz/clanky/tvorba-aplikaci-s-textovym-uzivatelskym-rozhranim-zalozenym-na-knihovne-prompt-toolkit/ - Tvorba textového rozhraní s knihovnou prompt_toolkit: základní prvky TUI
https://www.root.cz/clanky/tvorba-textoveho-rozhrani-s-knihovnou-prompt-toolkit-zakladni-prvky-tui/ - Tvorba TUI s knihovnou prompt_toolkit: aplikace s celoobrazovkovým rozhraním
https://www.root.cz/clanky/tvorba-tui-s-knihovnou-prompt-toolkit-aplikace-s-celoobrazovkovym-rozhranim/