Hlavní navigace

Kouzelné funkce a využití dalších skriptovacích jazyků v IPythonu

2. 3. 2021
Doba čtení: 24 minut

Sdílet

 Autor: Python
Dnes se zaměříme na popis dalších užitečných magických funkcí nabízených tímto nástrojem. Popíšeme si i možnost přidání vlastních kouzelných funkcí, využití dalších jazyků a kombinaci IPythonu s textovými editory a IDE.

Obsah

1. Kouzelné funkce vestavěné do IPythonu

2. Zobrazení historie zadaných příkazů

3. Uložení a obnova obsahu proměnných z diskového úložiště

4. Výpis proměnných, popř. jejich typů

5. Zjištění doby běhu určité funkce či části kódu

6. Spuštění vybrané funkce v profileru

7. Integrace IPythonu s debuggerem

8. Volání funkcí bez nutnosti psaní závorek

9. Přechod do jiného adresáře, výpis aktuálního adresáře

10. Zobrazení historie navštívených adresářů

11. Příkazy zapsané v odlišném jazyce, popř. jiné verze Pythonu

12. Přidání vlastní kouzelné funkce

13. Integrace IPythonu s Vimem

14. IPython v PyDev

15. IPython a integrované vývojové prostředí Spyder

16. IPython a PuDB: spojení výkonného interaktivního prostředí se skvělým debuggerem

17. Základní informace o PuDB

18. Nastavení IPythonu v debuggeru PuDB

19. Příloha: seznam standardních kouzelných funkcí IPythonu

20. Odkazy na Internetu

1. Kouzelné funkce vestavěné do IPythonu

Ve druhém článku o IPythonu navážeme na článek úvodní. Zaměříme se na popis dalších užitečných magických funkcí nabízených tímto nástrojem. Popíšeme si i možnost přidání vlastních kouzelných funkcí (magic functions), využití dalších skriptovacích jazyků přímo z prostředí IPythonu a kombinaci IPythonu s programátorskými textovými editory, popř. s integrovanými vývojovými prostředími. Nezapomeneme ani na zmínku o integraci IPythonu do pokročilého debuggeru pudb, s nímž jsme se již na stránkách Roota seznámili v samostatném článku.

Obrázek 1: Prostředí IPythonu je založeno na konceptu takzvaných buněk (cells), k jejichž obsahu i vypočteným výsledkům je možné se v případě potřeby vrátit.

Již v předchozím článku jsme se seznámili s některými kouzelnými funkcemi IPythonu (magic functions). Připomeňme si ve stručnosti, o jakých funkcích jsme se bavili. Především se jednalo o funkce pojmenované %cpaste a %edit. Díky jejich existenci lze do prostředí 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. V případě funkce %cpaste se vkládání ukončuje klávesovou zkratkou Ctrl+D. Kouzelná funkce %edit (lze ji vyvolat i přes klávesu F2) nám umožní spustit editor s možností úpravy vybraného objektu či vytvoření objektu nového. Pro načtení souboru se zdrojovými kódy se používá kouzelná funkce nazvaná %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.

Poznámka: kouzelnou funkci %save si ovšem nesmíme plést s funkcí %store, která má poněkud odlišný význam popsaný níže.

Obrázek 2: Vestavěná nápověda IPythonu. Ta je pochopitelně k dispozici i pro všechny kouzelné funkce popisované v dnešním článku.

2. Zobrazení historie zadaných příkazů

První kouzelnou funkcí, s níž se v dnešním článku seznámíme, je funkce nazvaná %history (připomeňme si, že jména kouzelných funkcí začínají znakem procenta či v některých případech dvěma procenty). Funkce %history dokáže zobrazit historii dříve zadaných příkazů, přičemž přístup do historie je možný hned několika způsoby, typicky ovšem zadáním rozsahu:

Obrázek 3: Nápověda zobrazená ke kouzelné funkci %history.

Ukažme si nyní jedno z možných použití této funkce. Zobrazíme posledních dvacet příkazů, a to včetně čísel řádků (přepínač -n) a taktéž vlastních příkazů (přepínač -o):

In [63]: %history -n -o 1-20
 
   1: os.*dir*
   2: os.*dir*?
   3: import os
   4: os.*dir*
   5: os.*dir*?
   6: import os
   7: os.*dir*?
   8: os.chdir?
   9: os.chdir?
  10: os.chdir??
  11: ??os.chdir
  12: ??os.chdir??
  13: import math
  14: math.*?
  15: math.*a?
  16: math.*r?
  17: math.*r*?
  18: math.*rand*?
  19: *rand*?
  20: *rand*?

Užitečný je i přepínač -g, který nám umožňuje specifikovat vzorek (pattern), který je následně vyhledáván v historii příkazů. Vzorek ovšem v tomto případě není běžným regulárním výrazem, ale „globem“ využívaným například v shellu při specifikaci jmen souborů. Podporovány jsou tedy zejména žolíkové znaky „*“ a „?“. Podívejme se nyní na využití tohoto přepínače:

Obrázek 4: Několik běžných příkazů, které se zapíšou do historie IPythonu (pro aktivní sezení).

Obrázek 5: Výpis celé historie příkazů.

Obrázek 6: Výpis příkazů obsahujících řetězec „foobar“.

Obrázek 7: Výpis příkazů obsahujících vzorek „oo“ následovaný libovolnými znaky.

Poznámka: s historií zapsaných příkazů jsme se již seznámili v úvodním článku o IPythonu. Za připomenutí stojí zejména možnost programového přístupu k historii přes seznamy pojmenované In a Out. Historie zapsaných řádků je dostupná po stisku klávesové zkratky Ctrl+R, která spustí režim prohledávání v historii. Jednoduchý průchod historií nabízí i kurzorové šipky nahoru a dolů.

3. Uložení a obnova obsahu proměnných z diskového úložiště

Minule jsme se seznámili i s kouzelnou funkcí pojmenovanou %save, kterou je možné použít pro uložení zdrojového textu či jeho části (popř. i jednotlivých příkazů) do specifikovaného souboru. Existuje ovšem i možnost uložení obsahu vybraných proměnných, které tak dokážou „přežít“ ukončení IPythonu. Pro tento účel slouží magická funkce nazvaná %store, která slouží pro uložení vybraných (explicitně zapsaných) proměnných na disk. Po opětovném spuštění IPythonu se tyto proměnné mohou obnovit příkazem %store s přepínačem -r:

Obrázek 8: Nápověda zobrazená ke kouzelné funkci %history.

Opět si ukažme použití této velmi užitečné kouzelné funkce na jednoduchém příkladě:

Obrázek 9: Definice několika proměnných globálních v rámci aktuálního jmenného prostoru.

Obrázek 10: Explicitní uložení proměnných na disk kouzelnou funkcí %store.

Obrázek 11: Po opětovném startu IPythonu nejsou dříve uložené proměnné dostupné (začíná se tedy pracovat „na zelené louce“).

Obrázek 12: Načtení obsahu proměnných z disku – proměnné i jejich obsah (včetně typu) byly obnoveny.

Poznámka: hodnoty proměnných jsou uloženy v podadresáři „~/.ipython/profile_defau­lt/db/autorestore“. Pro serializaci a deserializaci se používá modul pickle, takže uložit lze jen ty proměnné, jejichž obsah je skutečně serializovatelný (může se jednat i o objekty atd.):
$ ls -1 ~/.ipython/profile_default/db/autorestore/
 
a
b
c
d
e
f
g

4. Výpis proměnných, popř. jejich typů

Další dvě kouzelné funkce vestavěné do IPythonu, s nimiž se v dnešním článku ve stručnosti seznámíme, se jmenují %who a %whos. První z těchto funkcí vypíše obsah všech manuálně definovaných globálních proměnných, popř. proměnných, které odpovídají zadanému vzoru (viz též kouzelnou funkci %history zmíněnou výše):

Obrázek 13: Nápověda zobrazená ke kouzelné funkci %who.

Funkce %whos provádí podobnou činnost, ovšem s tím, rozdílem, že se o proměnných vypíše větší množství informací (typ i hodnotu):

Obrázek 14: Nápověda zobrazená ke kouzelné funkci %whos.

Základní použití těchto dvou funkcí je ukázáno na dvojici screenshotů:

Obrázek 15: Použití kouzelné funkce %whos.

Obrázek 16: Použití kouzelných funkcí %who a %whos v jiném sezení (session) s odlišnými proměnnými.

Poznámka: důležité je, že se vypíšou manuálně zadané proměnné, nikoli všechny globálně viditelné proměnné. To by v praxi totiž nemuselo být příliš užitečné, neboť po načtení několika balíčků může být počet všech globálně viditelných proměnných obrovský.

5. Zjištění doby běhu určité funkce či části kódu

Mnohdy je zapotřebí zjistit dobu trvání běhu nějaké Pythonovské funkce, popř. části kódu. K tomuto účelu je možné v IPythonu použít kouzelnou funkci nazvanou příznačně %timeit, která dokonce umožňuje opakované měření (což zlepší přesnost a eliminuje případný čas nutný pro „zahřátí“ daného kusu kódu):

Obrázek 17: Nápověda zobrazená ke kouzelné funkci %timeit.

Použití této magické funkce je ve skutečnosti velmi snadné, což je ostatně patrné i z následující čtveřice screenshotů s popisem prováděných operací:

Obrázek 18: Přenos zdrojového kódu funkce pro (dosti neefektivní) výpočet faktoriálu do prostředí IPythonu přes schránku s využitím již dříve popsané magické funkce %cpaste.

Obrázek 19: Změření doby výpočtu faktoriálu ze sedmi měření, z nichž každé výpočet spustilo 10000×.

Obrázek 20: Změna počtu spuštění měřené funkce pro každé ze sedmi měření.

Obrázek 21: Modifikovat je možné v případě potřeby i samotný počet měření (ve výchozím nastavení se provádí sedm měření).

Poznámka: zmenšení počtu měření, popř. to, kolik výpočtů se má v každém měření provést, do značné míry záleží na časové složitosti měřeného kódu. Výpočet faktoriálu probíhá (z lidského pohledu) velmi rychle, takže pro rozumnou přesnost měření času bylo zapotřebí provést v každém měření 10 000 výpočtů. U déletrvajících funkcí to však mohou být pouze jednotky výpočtů.

6. Spuštění vybrané funkce v profileru

Kromě jednoduchého měření času lze vybranou funkci spustit v pythonovském profileru, a to konkrétně s využitím kouzelné funkce nazvané %prun (neboli profiler run). Výsledkem budou podrobnější informace o tom, jaké funkce byly v průběhu sledování a měření volány a co se v průběhu měření vlastně dělo (přístupy do databáze, čisté výpočty atd.):

Obrázek 22: Nápověda zobrazená ke kouzelné funkci %prun.

Ukázka výsledků získaných funkcí %prun při zavolání jednoduché funkce pro výpočet faktoriálu (která je rekurzivní a interně nevolá další funkce kromě vyhodnocování konstrukce assert):

Obrázek 23: Výsledky získané profilerem přes magickou funkci %prun.

Následuje další demonstrační příklad ukazující, která část funkce pro převod celočíselné hodnoty na římské číslice je časově nejsložitější (pro daný vstup):

In [2]: # %load roman_test.py 
   ...: def roman(number):
   ...:     return (
   ...:             (number * 'I')
   ...:             .replace('IIIII', 'V')
   ...:             .replace('IIII', 'IV')
   ...:             .replace('VV', 'X')
   ...:             .replace('VIV', 'IX')
   ...:             .replace('XXXXX', 'L')
   ...:             .replace('XXXX', 'XL')
   ...:             .replace('LL', 'C')
   ...:             .replace('LXL', 'XC')
   ...:             .replace('CCCCC', 'D')
   ...:             .replace('CCCC', 'CD')
   ...:             .replace('DD', 'M')
   ...:             .replace('DCD', 'CM')
   ...:     )
   ...:
 
In [3]: %prun roman(999999)
         16 function calls in 0.016 seconds
 
   Ordered by: internal time
 
   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
       12    0.015    0.001    0.015    0.001 {method 'replace' of 'str' objects}
        1    0.001    0.001    0.016    0.016 <ipython-input-2-e61a7f8b7a92>:2(roman)
        1    0.000    0.000    0.016    0.016 {built-in method builtins.exec}
        1    0.000    0.000    0.016    0.016 <string>:1(<module>)
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}
Poznámka: nejedná se o můj algoritmus, ale uvádím ho zde mj. i proto, že je velmi elegantní, i když možná nikoli nejrychlejší.

7. Integrace IPythonu s debuggerem

Přímo z prostředí IPythonu je možné volat i debugger. Výchozím podporovaným debuggerem je standardní pdb neboli „The Python Debugger“. Pro vyvolání debuggeru slouží kouzelná funkce %debug:

Obrázek 24: Nápověda zobrazená ke kouzelné funkci %debug.

Základní způsob použití tohoto příkazu si ukážeme na několika screenshotech:

Obrázek 25: Načtení funkce, kterou budeme ladit.

Obrázek 26: Spuštění pdb a zobrazení jeho nápovědy.

Poznámka: povšimněte si, že se změnila i výzva – prompt.

Obrázek 27: Základním příkazem je s neboli step, kterým lze krokovat laděnou funkcí.

Obrázek 28: Zobrazení hodnoty parametru n.

Obrázek 29: Příkazem ll se zobrazí právě laděná funkce nebo metoda se zvýrazněním aktuálního řádku.

Poznámka: podrobnějším popisem možností pdb se budeme zabývat v samostatném článku.

8. Volání funkcí bez nutnosti psaní závorek

Další potenciálně užitečná magická funkce se jmenuje %autocall. Jedná se o funkci akceptující jeden parametr, který určuje, v jakém případě bude nutné okolo parametrů volaných (běžných) funkcí psát kulaté závorky:

%autocall x Význam
0 závorky bude nutné psát, jako v běžném Pythonu
1 prázdné závorky bude nutné psát u funkce bez parametrů
2 závorky nebude nutné psát

Obrázek 30: Nápověda zobrazená k magické funkci %autocall.

Opět si ukažme příklad použití:

Obrázek 31: Použití %autocall 2 (zavolají se i funkce bez parametrů).

Obrázek 32: Použití %autocall 1 (funkce bez parametrů je nutné volat tak, jako v Pythonu).

9. Přechod do jiného adresáře, výpis aktuálního adresáře

Při práci na větším projektu není neobvyklé, že je nutné přecházet mezi různými adresáři – přitom vždy jeden adresář je aktivní (pracovní). Pro přechod mezi adresáři slouží magická funkce %cd, jejíž základní použití je podobné obdobně pojmenovanému příkazu shellu:

Obrázek 33: Nápověda zobrazená k magické funkci %cd.

Pracovní, tedy aktivní adresář se, opět podobně jako v shellu, vypíše magickou funkcí pojmenovanou %pwd neboli print working directory:

Obrázek 34: Nápověda zobrazená k magické funkci %pwd.

U funkce %cd lze pochopitelně použít klávesu Tab zobrazující menu s nabídkou dostupných adresářů. Dále je možné se vrátit do předchozího adresáře příkazem %cd -. Navštívené adresáře se totiž zapisují do seznamu s historií:

Obrázek 35: Nabídka adresáře po stisku klávesy Tab.

Obrázek 36: Některé možnosti nabízené magickými funkcemi %cd a %pwd.

10. Zobrazení historie navštívených adresářů

Jak jsme si již řekli v předchozí kapitole, uchovává si IPython historii navštívených adresářů, ke které je možné se později vrátit. K zobrazení této historie slouží magická funkce %dhist, která dokáže zobrazit jak celou historii (pokud nejsou uvedeny žádné další parametry) či pouze vybranou část historie:

Obrázek 37: Nápověda zobrazená k magické funkci %dhist.

Použití této kouzelné funkce je ve skutečnosti velmi jednoduché:

Obrázek 38: Zobrazení historie navštívených adresářů.

11. Příkazy zapsané v odlišném jazyce, popř. jiné verze Pythonu

IPython podporuje, což je poněkud zvláštní, spuštění příkazů zapsaných v odlišném programovacím jazyce, popř. v jiné verzi Pythonu. Tyto příkazy je ovšem nutné zapisovat s využitím příslušné kouzelné funkce, která musí začínat znaky %%. Dvojicí procent začínají ty magické funkce, které akceptují víceřádkový vstup, takže je zřejmé, že lze tvořit a zapisovat i složitější jazykové konstrukce, popř. definice. Příkazy se ukončují stiskem klávesové zkratky Ctrl+D Enter. Pochopitelně si opět ukážeme několik příkladů.

Použití Pythonu 2, i když samotný IPython je založen na Pythonu 3:

In [40]: %%python2
    ...: a = 42
    ...: print a
    ...: (Ctrl+D)
    ...: (Enter)
 
42

Volání více příkazů BASHe:

In [45]: %%bash
    ...: pwd
    ...: ls
    ...: (Ctrl+D)
    ...: (Enter)
 
/home/ptisnovs/src/python
baf.py
fuzzer.py
most-popular-python-libs
pipenv.htm
python_dotenv.htm
python-programming-courses
python-schema-checks
repos
roman.py
roman_test.py
spellcheck.py
svitava-gui
test_anim.py
testing-in-python
xrepos

Spuštění části kódu zapsaného v Perlu:

In [49]: %%perl
    ...: $a=42;
    ...: print $a;
    ...: (Ctrl+D)
    ...: (Enter)
 
42
Poznámka: výstup těchto příkazů však není možné zpracovat tak plnohodnotně, jako je tomu ve vlastním „nativním“ Pythonu, o čemž se ostatně můžete sami přesvědčit prozkoumáním proměnné Out.

12. Přidání vlastní kouzelné funkce

Do prostředí IPythonu je možné přidat i vlastní kouzelné funkce. Pojďme si nyní ve stručnosti ukázat, jak se tato operace provádí. Nejprve je nutné naimportovat dekorátor nazvaný register_line_magic, popř. register_cell_magic podle toho, zda se má nová magická funkce aplikovat na jediný vstupní řádek, nebo na celou několikařádkovou buňku. Pokud se bude jednat o magickou funkci pro jediný vstupní řádek, zapíšeme:

In [54]: from IPython.core.magic import register_line_magic

Dalším krokem je vytvoření libovolné funkce, u které bude tento dekorátor použit:

In [5]: @register_line_magic
   ...: def magic_function(line):
   ...:     return line.upper()

Použití takto vytvořené magické funkce:

In [6]: %magic_function foobar
Out[6]: 'FOOBAR'
Poznámka: pozor si musíte dát především na to, že celá vstupní řádka je přenesena jako jediný řetězec – případné rozdělení na jednotlivé parametry si můžete provést sami, například takto primitivně a bez kontrol (což by v praxi nebylo nejvhodnější řešení):
In [15]: @register_line_magic
    ...: def x2(line):
    ...:     params = line.split(" ")
    ...:     return params[0] + "/" + params[1]
    ...:
 
In [16]: %x2 foo bar
Out[16]: 'foo/bar'

Obrázek 39: Zobrazení dokumentace a současně i zdrojového kódu uživatelem definované funkce.

13. Integrace IPythonu s Vimem

IPython je možné relativně snadno integrovat s textovým editorem Vim. V současnosti existuje dokonce několik pluginů pro Vim, které tuto integraci zajišťují. Starší a dnes již dále nevyvíjený plugin se jmenuje vim-python, ovšem pro nové verze IPythonu je doporučováno použít spíše plugin pojmenovaný Jupyter-Vim (což je poněkud matoucí jméno, pokud si ovšem neuvědomíme, že v projektu Jupyter je základním kernelem právě IPython). Použití tohoto pluginu bude podrobněji ukázáno v samostatném článku, ovšem v kontextu dnešního textu bylo vhodné alespoň upozornit na existenci tohoto přídavného modulu.

14. IPython v PyDev

Další možnost integrace IPythonu souvisí s vývojovým prostředím nazvaným PyDev. Toto IDE je ve skutečnosti modulem určeným pro integraci do univerzálního prostředí Eclipse. Vývoj projektu Eclipse byl zahájen na přelomu tisíciletí ve společnosti IBM a v současnosti se jedná o aplikaci šířenou pod licencí EPL. EPL je licence v některých ohledech poněkud odlišná od známé GNU GPL, to však nijak neovlivňuje možnosti použití Eclipse ve funkci IDE v Linuxu. Ostatně i z tohoto důvodu najdeme Eclipse i v základních balíčcích Fedory, což by v případě problematičtějšího licenčního modelu pochopitelně nebylo možné. V případě Eclipse se původně mělo jednat o integrované vývojové prostředí (IDE), které mělo představovat alternativu k tehdy již existujícímu prostředí Visual Age založenému na programovacím jazyku Smalltalk (toto prostředí je nicméně stále používáno a existuje okolo něj loajální, i když asi dnes již dosti malá komunita), později se z Eclipse stala univerzální platforma používaná jak ve funkci integrovaného vývojového prostředí, tak i ve funkci takzvaného „rich clienta“. A právě tuto schopnost Eclipse využili (kromě mnoha jiných programátorů) i vývojáři prostředí PyDev.

Obrázek 40: Ladění programu napsaného v Pythonu s využitím možností, které vývojářům poskytuje integrované vývojové prostředí PyDev.

V PyDevu jsou k dispozici dvě hlavní perspektivy (layout oken) nazvané PyDev a Debug. Tyto perspektivy se někdy přepínají automaticky, například při ladění aplikace, ovšem přepnutí je možné provést i ručně, a to výběrem perspektivy v pravém horním rohu grafického uživatelského rozhraní vývojového prostředí Eclipse. Kromě perspektiv si lze prakticky kdykoli nechat zobrazit další podokna se speciálním obsahem a významem. Tato podokna se nazývají views a v případě použití PyDev je možné použít například pohled na strukturu projektu (Outline), výsledky běhu jednotkových testů (PyUnit), výsledky zjištění pokrytí kódu testy (Code Coverage), seznam problémů nalezených v projektu (Problems) či seznam TODO zapsaných do zdrojových kódů (Tasks). Mezi pohledy patří i konzole (Console) zobrazující standardní i chybový výstup. Se všemi těmito okny lze manipulovat, tj. přemisťovat je, „vytáhnout“ je mimo hlavní okno Eclipse apod.

Obrázek 41: Dialog pro vytvoření nového projektu. Můžete zde vidět volbu interpretru (verzi i typ). PyDev v této oblasti vývojáře neomezuje (tj. například je k dispozici i starodávný Python 2.x), samozřejmě však musí mít vybraný interpret nainstalován ve svém systému.

PyDev obsahuje i integrovanou konzoli s interpretrem Pythonu. Do této konzole je možné se přepnout klávesovou zkratkou Ctrl+Alt+Enter, která dokáže přenést vybraný text do konzole a spustit ho. Pokud je cesta k IPythonu součástí proměnné prostředí PYTHONPATH, bude v konzoli použit právě IPython. Integrace je přitom obousměrná, protože pokud v konzoli použijeme kouzelnou funkci %edit nebo klávesovou zkratku F2 (viz předchozí článek), otevře se okno editoru přímo v prostředí PyDev (resp. Eclipse).

Obrázek 42: Nastavení konzole v PyDev.

15. IPython a integrované vývojové prostředí Spyder

IPython je možné využívat i z integrovaného vývojového prostředí Spyder, které je orientováno přímo na vývoj aplikací v Pythonu s využitím dalších podpůrných projektů (pyflakes, pylint, pycodestyle, Jedi atd.). Spyder umožňuje, ostatně podobně jako výše zmíněné prostředí PyDev, zobrazit konzoli s interpretrem Pythonu, která je realizována právě s využitím IPythonu (resp. přesněji řečeno těchto konzolí může být otevřené prakticky libovolné množství). Podrobnější popis integrace IPythonu do Spyderu je popsán na této stránce.

Poznámka: za zmínku stojí i fakt, že v konzoli je možné zobrazit i grafické informace, což jsou typicky různé typy grafů vykreslované knihovnou Matplotlib.

16. IPython a PuDB: spojení výkonného interaktivního prostředí se skvělým debuggerem

IPython je možné integrovat i do samostatně spustitelného debuggeru nazvaného PuDB, o němž již na stránkách Rootu vyšel samostatný článek. Tento debugger ve výchozím nastavení používá standardní interaktivní smyčku (REPL) jazyka Python, ovšem v případě potřeby je možné provést přepnutí na IPython. Ovšem v tomto případě je integrace odlišná od integrace IPythonu s debuggerem pdb, kterou jsme si ve stručnosti popsali v sedmé kapitole. Zatímco pdb byl volán z prostředí IPythonu, v případě PuDB je tomu přesně naopak – IPython se volá v případě potřeby z debuggeru. Podrobnosti budou popsány v navazujících dvou kapitolách.

Obrázek xx: Zobrazení rekurzivní datové struktury, v tomto případě slovníku s dalšími slovníky, v debuggeru PuDB.

17. Základní informace o PuDB

V článcích Grafická nadstavba nad GNU Debuggerem gdbgui a její alternativy a Trasování a ladění nativních aplikací v Linuxu: použití GDB a jeho nadstaveb jsme se seznámili jak s GNU debuggerem (známým i pod zkratkou GDB nebo gdb), tak i s dalšími debuggery dostupnými v Linuxu. Kromě toho jsme si ukázali i některé nadstavby vytvořené nad GNU debuggerem. Dále jsme si v dalším článku, tentokrát s titulkem Užitečné skripty a pluginy pro textový editor Vim: propojení Vimu s debuggery ukázali, jak je možné nakonfigurovat známý a oblíbený textový editor Vim takovým způsobem, aby ho bylo možné použít jako frontend (tedy ve funkci uživatelského rozhraní) pro různé typy debuggerů určených jak pro ladění aplikací naprogramovaných v céčku, popř. C++ či aplikací vytvořených v Pythonu.

gdb1

Obrázek xx: Typické „sezení“ programátora využívajícího debugger gdb. Nastavení breakpointu příkazem b main, spuštění laděného programu příkazem r a krokování příkazem n (klávesa Enter zopakuje poslední zadaný příkaz, proto je n vlastně v tomto příkladu používán nadbytečně).

Pro aplikace naprogramované v Pythonu však existuje ještě jeden zajímavý a poměrně snadno ovladatelný debugger, který pro komunikaci s programátory používá plnohodnotné (celoobrazovkové) textové uživatelské rozhraní (TUI – Text-Based User Interface). Tento debugger se jmenuje PuDB a jeho uživatelské rozhraní je do značné míry inspirováno slavným Turbo Debuggerem, který si možná někteří čtenáři pamatují ze stařičkého DOSu i z Microsoft Windows (Turbo Debugger ovšem pochopitelně nebyl určen pro Python, ale pro aplikace naprogramované v Turbo/Borland Pascalu, Turbo C a později i Turbo C++). Dnes se seznámíme s možnostmi, které nám PuDB nabízí a pokusíme se tyto možnosti porovnat s dalšími debuggery dostupnými pro Python.

gdbtui

Obrázek xx: Aplikace gdbtui nabízí „alternativní“ celoobrazovkové ovládání debuggeru.

Instalace debuggeru PuDB je snadná, protože balíček s tímto nástrojem je dostupný na PyPi. Pro jeho instalaci tedy postačuje využít instalátor pip, popř. pip3 a provést buď instalaci pro všechny uživatele:

$ pip3 install pudb

nebo instalaci pro právě aktivního uživatele:

$ pip3 install --user pudb

Debugger PuDB vyžaduje kupodivu instalaci pouze dvou závislostí, především knihovny urwid sloužící pro tvorbu aplikací s celoobrazovkovým textovým uživatelským rozhraním a taktéž knihovny nazvané Pygments, která je používána pro zobrazování syntaxe zdrojových kódů či konfiguračních souborů. Celá instalace by měla proběhnout prakticky okamžitě:

Downloading/unpacking pudb
  Downloading pudb-2018.1.tar.gz (56kB): 56kB downloaded
  Running setup.py (path:/tmp/pip_build_tester/pudb/setup.py) egg_info for package pudb
    /usr/lib/python3.4/distutils/dist.py:260: UserWarning: Unknown distribution option: 'test_requires'
      warnings.warn(msg)
 
Requirement already satisfied (use --upgrade to upgrade): urwid>=1.1.1 in ./.local/lib/python3.4/site-packages (from pudb)
Requirement already satisfied (use --upgrade to upgrade): pygments>=1.0 in ./.local/lib/python3.4/site-packages (from pudb)
Installing collected packages: pudb
  Running setup.py install for pudb
    /usr/lib/python3.4/distutils/dist.py:260: UserWarning: Unknown distribution option: 'test_requires'
      warnings.warn(msg)
 
    Installing pudb3 script to /home/tester/.local/bin
Successfully installed pudb
Cleaning up...

V případě lokální instalace bude spustitelný skript pudb nebo pudb3 dostupný v adresáři:

~/.local/bin

Obrázek xx: Zpráva zobrazená při prvním spuštění debuggeru.

18. Nastavení IPythonu v debuggeru PuDB

Nastavení IPythonu v debuggeru PuDB je ve skutečnosti velmi snadné. Nejdříve je nutné debugger spustit, tj. v typickém případě mu na příkazovém řádku předat jméno souboru s laděnou funkcí nebo metodou. Následně se stiskem klávesové zkratky Ctrl+P otevře panel „preferences“, v němž se kromě dalších nastavení zobrazuje i výběr shellu pro Python. Vybraný shell se spustí klávesovou zkratkou ! (a to i v průběhu ladění atd.):

Obrázek XX: PuDB po spuštění (s nastaveným barvovým schématem odvozeným od Vimu).

Obrázek XX: Po stisku klávesové zkratky Ctrl+P lze zvolit, jaký shell se bude spouštět. PuDB zobrazuje nabídku všech podporovaných shellů, bez ohledu na to, zda jsou skutečně nainstalovány!

Obrázek XX: Po stisku klávesy ! se spustí zvolený shell.

Hacking tip

Poznámka: v tomto kontextu se sice používá termín shell, ovšem myšleno je prostředí Pythonu, nikoli shell operačního systému (BASH atd.).

19. Příloha: seznam standardních kouzelných funkcí IPythonu

V následující tabulce jsou vypsány standardní kouzelné funkce IPythonu, které pracují s jediným vstupním řádkem, nikoli tedy s celou několikařádkovou buňkou:

# Kouzelná funkce
1 %alias
2 %alias_magic
3 %autoawait
4 %autocall
5 %autoindent
6 %automagic
7 %bookmark
8 %cat
9 %cd
10 %clear
11 %colors
12 %conda
13 %config
14 %cp
15 %cpaste
16 %debug
17 %dhist
18 %dirs
19 %doctest_mode
20 %ed
21 %edit
22 %env
23 %gui
24 %hist
25 %history
26 %killbgscripts
27 %ldir
28 %less
29 %lf
30 %lk
31 %ll
32 %load
33 %load_ext
34 %loadpy
35 %logoff
36 %logon
37 %logstart
38 %logstate
39 %logstop
40 %ls
41 %lsmagic
42 %lx
43 %macro
44 %magic
45 %man
46 %matplotlib
47 %mkdir
48 %more
49 %mv
50 %notebook
51 %page
52 %paste
53 %pastebin
54 %pdb
55 %pdef
56 %pdoc
57 %pfile
58 %pinfo
59 %pinfo2
60 %pip
61 %popd
62 %pprint
63 %precision
64 %prun
65 %psearch
66 %psource
67 %pushd
68 %pwd
69 %pycat
70 %pylab
71 %quickref
72 %recall
73 %rehashx
74 %reload_ext
75 %rep
76 %rerun
77 %reset
78 %reset_selective
79 %rm
80 %rmdir
81 %run
82 %save
83 %sc
84 %set_env
85 %store
86 %sx
87 %system
88 %tb
89 %time
90 %timeit
91 %unalias
92 %unload_ext
93 %who
94 %who_ls
95 %whos
96 %xdel
97 %xmode

Samozřejmě jsou k dispozici i magické funkce určené pro zpracování celé buňky, jejíž obsah může přesáhnout několik řádků a typicky obsahuje blok kódu (celou funkci atd.):

# Kouzelná funkce
1 %%!
2 %%HTML
3 %%SVG
4 %%bash
5 %%capture
6 %%debug
7 %%file
8 %%html
9 %%javascript
10 %%js
11 %%latex
12 %%markdown
13 %%perl
14 %%prun
15 %%pypy
16 %%python
17 %%python2
18 %%python3
19 %%ruby
20 %%script
21 %%sh
22 %%svg
23 %%sx
24 %%system
25 %%time
26 %%timeit
27 %%writefile
Poznámka: všechny kouzelné funkce je možné vypsat opět kouzelnou funkcí, konkrétně funkcí nazvanou %lsmagic.

20. Odkazy na Internetu

  1. Use IPython REPL in VS Code
    https://stackoverflow.com/qu­estions/52310689/use-ipython-repl-in-vs-code
  2. IPython for VSCode
    https://marketplace.visual­studio.com/items?itemName=pan­cho111203.vscode-ipython
  3. Domovská stránka projektu IPython
    https://ipython.org/
  4. IPython (Wikipedia)
    https://en.wikipedia.org/wiki/IPython
  5. Projekt IPython na PyPi
    https://pypi.org/project/ipython/
  6. Dokumentace k IPythonu
    http://ipython.org/documen­tation.html#
  7. IPython Documentation (na ReadTheDocs)
    https://ipython.readthedoc­s.io/en/stable/
  8. IPython Tutorial
    http://ipython.readthedoc­s.org/en/stable/interacti­ve/tutorial.html
  9. IPython Tips & Tricks
    https://ipython.readthedoc­s.io/en/stable/interactive/tip­s.html
  10. IPython cookbook
    https://github.com/ipython/i­python/wiki?path=Cookbook
  11. Cookbook: Index
    https://github.com/ipython/i­python/wiki/Cookbook%3A-Index
  12. Projects using IPython
    https://github.com/ipython/i­python/wiki/Projects-using-IPython
  13. Sebastian Witowski – Wait, IPython can do that?!
    https://www.youtube.com/wat­ch?v=3i6db5zX3Rw
  14. vim-ipython
    https://github.com/ivanov/vim-ipython
  15. IPython Frequently asked questions
    https://github.com/ipython/i­python/wiki/Frequently-asked-questions
  16. What is REPL?
    https://pythonprogramminglan­guage.com/repl/
  17. What is a REPL?
    https://codewith.mu/en/tu­torials/1.0/repl
  18. Programming at the REPL: Introduction
    https://clojure.org/guides/re­pl/introduction
  19. What is REPL? (Quora)
    https://www.quora.com/What-is-REPL
  20. Gorilla REPL: interaktivní prostředí pro programovací jazyk Clojure
    https://www.root.cz/clanky/gorilla-repl-interaktivni-prostredi-pro-programovaci-jazyk-clojure/
  21. Read-eval-print loop (Wikipedia)
    https://en.wikipedia.org/wi­ki/Read%E2%80%93eval%E2%80%93prin­t_loop
  22. Domovská stránka programovacího jazyka Python
    https://www.python.org/
  23. Domovská stránka projektu bpython
    https://bpython-interpreter.org/
  24. Projekt bpython na PyPi
    https://pypi.org/project/bpython/
  25. Git repositář projektu bpython
    https://github.com/bpython/bpython
  26. Projekt ptpython na PyPi
    https://pypi.org/project/ptpython/
  27. Git repositář projektu ptpython
    https://github.com/prompt-toolkit/ptpython
  28. Domovská stránka projektu DreamPie
    http://www.dreampie.org/
  29. Projekt DreamPie na PyPi
    https://pypi.org/project/dreampie/
  30. Git repositář projektu DreamPie
    https://github.com/noamraph/dreampie
  31. Integrovaná vývojová prostředí ve Fedoře: IPython a IPython Notebook
    http://mojefedora.cz/integrovana-vyvojova-prostredi-ve-fedore-ipython-a-ipython-notebook/
  32. 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/
  33. 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/
  34. 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/
  35. 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/
  36. Is IPython Notebook ever used as an IDE, or merely for presentations?
    https://www.reddit.com/r/I­Python/comments/1uk7hp/is_i­python_notebook_ever_used_as_an_i­de_or_merely/
  37. The IDE as a Bad Programming Language Enabler
    https://dzone.com/articles/ide-bad-programming-language
  38. Enhanced Interactive Python with IPython
    http://www.onlamp.com/pub/a/pyt­hon/2005/01/27/ipython.html
  39. Příkazový řádek – přítel nejvěrnější
    https://www.root.cz/clanky/prikazovy-radek-pritel-nejvernejsi/
  40. Příkazový řádek – přítel nejvěrnější (2)
    https://www.root.cz/clanky/prikazovy-radek-pritel-nejvernejsi-2/
  41. Picking a Python Interpreter (3 vs 2)
    https://docs.python-guide.org/starting/which-python/
  42. Využití knihovny Pygments (nejenom) pro obarvení zdrojových kódů
    https://www.root.cz/clanky/vyuziti-knihovny-pygments-nejenom-pro-obarveni-zdrojovych-kodu/
  43. 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/
  44. 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/
  45. 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/
  46. Pygments – Python syntax highlighter
    http://pygments.org/
  47. Pygments (dokumentace)
    http://pygments.org/docs/
  48. Write your own lexer
    http://pygments.org/docs/le­xerdevelopment/
  49. Jazyky podporované knihovnou Pygments
    http://pygments.org/languages/
  50. Pygments FAQ
    http://pygments.org/faq/
  51. Pygments 2.2.0 (na PyPi)
    https://pypi.org/project/Pygments/
  52. Syntax highlighting
    https://en.wikipedia.org/wi­ki/Syntax_highlighting
  53. Jedi – an awesome autocompletion/static analysis library for Python
    https://jedi.readthedocs.i­o/en/latest/index.html
  54. Jedi API Overview
    https://jedi.readthedocs.i­o/en/latest/docs/api.html
  55. jedi-vim
    https://github.com/davidhalter/jedi-vim
  56. 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/
  57. 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/
  58. 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/
  59. ØMQ: knihovna pro asynchronní předávání zpráv
    https://www.root.cz/clanky/0mq-knihovna-pro-asynchronni-predavani-zprav/
  60. Další možnosti poskytované knihovnou ØMQ
    https://www.root.cz/clanky/dalsi-moznosti-poskytovane-knihovnou-mq/
  61. What is the difference between Jupyter and IPython Notebook?
    https://www.quora.com/What-is-the-difference-between-Jupyter-and-IPython-Notebook
  62. Jupyter kernels
    https://github.com/jupyter/ju­pyter/wiki/Jupyter-kernels
  63. Keyboard Shortcuts in the IPython Shell
    https://jakevdp.github.io/Pyt­honDataScienceHandbook/01­.02-shell-keyboard-shortcuts.html
  64. New terminal interface
    https://ipython.readthedoc­s.io/en/stable/whatsnew/ver­sion5.html#new-terminal-interface
  65. prompt-toolkit
    https://python-prompt-toolkit.readthedocs.io/en/stable/
  66. 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/
  67. 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/
  68. 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/
  69. 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/
  70. pdb — The Python Debugger
    https://docs.python.org/3/li­brary/pdb.html
  71. 12 Best Python IDEs and Code Editors in 2021
    https://www.softwaretestin­ghelp.com/python-ide-code-editors/
  72. Interactive console in PyDev
    https://www.pydev.org/manu­al_adv_interactive_console­.html
  73. vim-ipython
    https://github.com/ivanov/vim-ipython
  74. jupyter-vim
    https://github.com/jupyter-vim/jupyter-vim

Autor článku

Pavel Tišnovský vystudoval VUT FIT a v současné době pracuje ve společnosti Red Hat, kde vyvíjí nástroje pro OpenShift.io.