Vedle běžných integrovaných vývojových prostředí, mezi něž patří například Eclipse, Netbeans či Visual Studio, se v některých případech můžeme setkat s poněkud odlišným přístupem programátorů k nástrojům používaným pro vývoj. Příkladem může být například systém IPython nabízející jak vylepšenou interaktivní smyčku REPL běžící v terminálu či ve vlastním okně (Qt Console), tak i takzvaný „diář“ představovaný nástrojem IPython Notebook. Právě s IPythonem se seznámíme v dnešním článku.
Obsah
1. Integrovaná vývojová prostředí ve Fedoře: IPython a IPython Notebook
2. První používaný koncept: klasická IDE
3. Alternativní koncepty: interaktivní smyčka REPL a diář (notebook)
5. Interaktivní rozhraní IPythonu
6. IPython Qt Console aneb vylepšený pseudoterminál
7. Zobrazení grafů přímo v Qt Consoli
8. Rozdělení plochy Qt Console na několik samostatných terminálů
1. Integrovaná vývojová prostředí ve Fedoře: IPython a IPython Notebook
V předchozích částech seriálu o integrovaných vývojových prostředích, která je možné použít (nejenom) pro vývojáře pracující ve Fedoře, jsme se zaměřili především na IDE s vlastním textovým či grafickým uživatelským rozhraním nabízejícím různé pohledy na vytvářený a laděný projekt. Tato IDE jsou v naprosté většině případů postavena na konceptu, který si možná někteří uživatelé pamatují ještě z dob kralování Turbo Pascalu společnosti Borland: v integrovaném vývojovém prostředí se nějakým způsobem vytvoří projekt skládající se (obecně) z mnoha zdrojových souborů, takže IDE vývojářům nabízí okno s hierarchií souborů a tříd použitých v projektu, dále pak okna s integrovaným programátorským textovým editorem a popř. i další specializovaná okna používaná například v průběhu ladění či při používání systémů pro správu verzí (GIT, Mercurial, Subversion atd.).
Obrázek 1: Integrované vývojové prostředí Turbo Pascalu pro DOS.
Některá IDE, zejména pak prostředí založená na platformě Eclipse, tento koncept dále rozšiřují, protože samotná okna (v prostředí Eclipse se jim říká pohledy neboli views) jsou sdružena do perspektiv (perspective), mezi kterými se programátor může automaticky či manuálně přepínat v závislosti na právě prováděné činnosti. Například při úpravách zdrojového kódu je použita perspektiva, jejíž hlavní součástí je okno programátorského editoru, při ladění se naopak uplatní perspektiva zobrazující jen menší část zdrojového kódu, ovšem doplněná o výpis aktivních proměnných, vláken aplikace, zásobníkových rámců či obsahu vybrané části operační paměti, další perspektiva se použije při porovnávání dvou verzí zdrojových kódů apod.
Obrázek 2: Jedna z možností refaktoringu nabízená prostředím PyDev (založeno na Eclipse).
2. První používaný koncept: klasická IDE
Klasická integrovaná vývojová prostředí jsou většinou určena pro práci na rozsáhlejších projektech s mnoha zdrojovými soubory a popř. i s košatou hierarchií objektů (ostatně právě to byl jeden z hlavních důvodů jejich vzniku – programátoři se museli začít orientovat ve stále větších a taktéž komplikovanějších projektech). Po takových integrovaných vývojových prostředích se většinou požaduje především co nejsnadnější orientace ve zpracovávaném projektu, automatické doplňování kódu (například názvů metod), přístup ke všem globálním symbolům (moduly, třídy, globální proměnné, funkce) společně s interaktivní filtrací seznamu symbolů, podpora pro ladění vznikajících aplikací a popř. i integrace s nástroji pro testování a refaktoring zdrojových kódů.
Obrázek 3: I pokročilý textový editor Atom je možné nakonfigurovat do podoby integrovaného vývojového prostředí.
Mezi takto koncipovaná integrovaná vývojová prostředí patří Eclipse (Java Development Toolkit, C/C++ Development Toolkit, PyDev, ...), IDEA, Netbeans (opět s podporou pro větší množství jazyků), Visual Studio či poněkud méně ambiciózní projekty, jako je Anjuta, Geany, Code::Blocks, Qt Creator, IDLE, Eric, Spyder, Gambas popř. Lazarus (mnohá z těchto prostředí se zaměřují na podporu jen jednoho programovacího jazyka, další prostředí se snaží být univerzálně použitelná). Do určité míry je možné integrované vývojové prostředí vytvořit například i z textových editorů Vim, Emacs a Atom doplněných o potřebné moduly (pluginy).
Obrázek 4: Především programátoři používající C++ ocení možnosti prostředí Code::Blocks.
3. Alternativní koncepty: interaktivní smyčka REPL a diář (notebook)
Někteří programátoři, popř. ti uživatelé, kteří programovací jazyk musí používat pro řešení problémů ve své profesi (ovšem vývoj aplikací není jejich hlavní pracovní náplní), však preferují dosti odlišný způsob práce, který je v mnohem větší míře založen na interakci mezi vývojářem a systémem nebo vznikající aplikací. V takových případech ustupuje správa projektů poněkud do pozadí a naopak se začíná využívat odlišný druh vývojového prostředí založený buď na takzvané interaktivní smyčce REPL (Read-Eval-Print-Loop) nebo na konceptu takzvaných diářů (notebooks), které jsou už poměrně dlouho velmi populární především v systémech pro numerickou matematiku, analýzy, statistické výpočty i symbolickou matematiku (manipulace se symboly a výrazy, integrace, derivace, zjednodušování výrazů atd.).
Obrázek 5: Za zjednodušenou formu interaktivní smyčky REPL je možné považovat i přímý mód (direct mode) použitý například v BASICu. Na tomto screenshotu je v přímém módu zapsán příkaz LIST.
Poměrně velkou předností těchto systémů oproti klasickým integrovaným vývojovým prostředím je zejména okamžitá zpětná vazba systému na zadávané deklarace a příkazy. To uživatelům umožňuje se snadněji a taktéž rychleji seznámit jak s vlastním programovacím jazykem (nalezení chyby na jediném programovém řádku je určitě snazší, než analýza mnohdy několikastránkového výpisu vytvořeného překladačem), tak i s použitými knihovnami. To je dnes vlastně ještě důležitější, protože mnohdy vývoj spočívá v „lepení“ již existujících komponent či knihoven. Aplikace vytvářené v takto koncipovaných prostředích většinou vznikají systémem zdola-nahoru (bottom-up programming), tj. postupně se skládají z funkcí a tříd, které mohou být ihned po své deklaraci otestovány.
Obrázek 6: Koncept diáře je použit například v nástroji Gorilla REPL, který mohou využít programátoři pracující s jazykem Clojure.
4. Představuje se IPython
V dnešním článku se zaměříme na nástroj nazvaný IPython, který zpřístupňuje možnosti interaktivní komunikace s interpretrem těm vývojářům i dalším uživatelům, kteří používají dnes velmi populární programovací jazyk Python (i když je pravda, že struktura IPythonu ve skutečnosti dovoluje použití dalších programovacích jazyků). Architektura nástroje IPython je navržena takovým způsobem, že je do značné míry modulární, což mj. znamená, že uživatelé mohou s IPythonem komunikovat hned několika možnými způsoby. My se v tomto článku zaměříme zejména na použití interaktivního shellu (což je vlastně v mnoha ohledech vylepšená varianta smyčky REPL) a taktéž na IPython Notebook, což je naopak implementace konceptu diáře (notebooku). Další množnosti komunikace s IPythonem spočívají v použití 0MQ (Zero MQ), což je zjednodušeně řečeno řešení postavené na bázi socketů.
Obrázek 7: IPython je možné ovládat z terminálu (což je základní možnost).
Možnosti IPythonu jsou však ve skutečnosti mnohem větší, než „pouhé“ vylepšené rozhraní mezi uživatelem a interpretrem. Architektura IPythonu například umožňuje, aby se komplikované výpočty neprováděly přímo na tom počítači, kde je spuštěn interaktivní shell (klient), ale aby se pouze předaly dalším strojům tvořícím výpočetní farmu. Díky tomu – a taktéž díky propojení IPythonu s knihovnami NumPy a SciPy i s nástrojem matplotlib – se IPython používá i v těch oblastech, kde se provádí mnoho složitých a/nebo časově náročných výpočtů, což může znít poněkud paradoxně, když si uvědomíme, že samotný Python je v těchto ohledech dosti pomalý jazyk (ve skutečnosti NumPy předává výpočty nativnímu kódu psanému v C popř. ve Fortranu). K této problematice se ostatně vrátíme v navazujícím textu, kde se budeme podrobněji zabývat především propojením NumPy a matplotlib.
Obrázek 8: Pro použití nástroje IPython Notebook postačuje použít jakýkoli moderní webový prohlížeč.
5. Interaktivní rozhraní IPythonu
Základním modulem určeným pro komunikaci uživatele či programátora s jádrem IPythonu je interaktivní shell. Ten se spouští příkazem ipython popř. ipython3, samozřejmě v závislosti na tom, zda vyžadujete práci s interpretrem jazyka Python 2.x či naopak jeho novější varianty Python 3.x (navíc se jedná i o odlišné balíčky, takže je sice možné mít nainstalován jak Python 2.x i Python 3.x, ovšem IPython je nutné taktéž nainstalovat ze dvou oddělených balíčků):
Obrázek 9: IPython využívající interpret jazyka Python 2.x.
Obrázek 10: IPython využívající interpret jazyka Python 3.x.
Interaktivní shell IPythonu se sice na první pohled může podobat klasickému interaktivnímu rozhraní interpretru Pythonu, ve skutečnosti jsou však možnosti IPythonu mnohem větší. Podívejme se na první podstatný rozdíl, který má dopad zejména na praktické použití IPythonu. Pokud v interpretru Pythonu potřebujeme například napsat programovou smyčku, je nutné provést ruční odsazení těla smyčky, jinak dojde k chybě. Namísto toho v IPythonu se odsazení provede automaticky, protože konec vnořeného bloku se oznamuje prázdným řádkem. To je pro interaktivní použití mnohem přirozenější chování:
Obrázek 11: Chování klasického interpretru Pythonu při psaní vnořených bloků bez odsazení.
Obrázek 12: Stejný kód se v IPythonu bez problémů provede.
Mezi další přednosti interaktivního shellu IPythonu patří automatické doplňování kódu klávesou Tab, plnohodnotná historie zadaných příkazů (podobně jako v BASHi, tedy například s velmi užitečnou klávesovou zkratkou Ctrl+R určenou pro hledání v historii) a taktéž speciální pseudopříkazy (nazývané „magické“). Pokud například potřebujete zjistit podrobnější informace o nějakém identifikátoru (jménu funkce, metody, třídy či proměnné), stačí za název vložit znak otazníku:
Obrázek 13: Zobrazení podrobnějších informací o identifikátoru.
Obrázek 14: Zobrazení podrobnějších informací o identifikátoru.
Další magické pseudopříkazy začínají znakem procenta. Například lze zjistit a zobrazit dokumentaci ke zvolené třídě, metodě či funkci, a to konkrétně pseudopříkazem %pdoc. Opět se podívejme na jednoduchý příklad:
Obrázek 15: Zobrazení dokumentace s využitím pseudopříkazu %pdoc.
Všechny magické pseudopříkazy lze vypsat s využitím %lsmagic (i názvy pseudopříkazů se samozřejmě mohou doplňovat klávesou Tab):
Obrázek 16: Výpis všech dostupných pseudopříkazů.
Poznámka: IPython obsahuje i několik aliasů systémových příkazů, takže můžete použít například příkaz ls, který spustí skutečné ls a navíc obarví výsledek podle typů nalezených a vypisovaných souborů. Podobně bude funkční i příkaz pwd apod.
6. IPython Qt Console aneb vylepšený pseudoterminál
Někteří uživatelé systému IPython preferují namísto klasického terminálu (resp. přesněji řečeno emulátoru terminálu), v němž běží IPython, použití nástroje nazvaného IPython Qt Console. Jak název tohoto nástroje naznačuje, jedná se o obdobu terminálu či konzole, ovšem s několika vylepšeními. Mezi první vylepšení patří především existence „bublinové nápovědy“, která se zobrazí například ve chvíli, kdy se mají zadávat parametry funkce či metody. Mezi další vylepšení patří podpora pro vkládání grafů, obrázků a dalších mediálních dat přímo do plochy Qt Console, čímž se možnosti tohoto nástroje přibližují dále popsanému IPython Notebooku (toto téma si osvětlíme v navazující kapitole). Poznámka na okraj: i když Qt Console používá knihovnu Qt, lze ji bez problémů použít i v Gnome Shellu či v jakémkoli jiném prostředí včetně XFCE či Fluxboxu.
Obrázek 17: Pohled na spuštěnou Qt Consoli.
Pokud chcete použít Qt Consoli, použijte příkaz:
ipython qtconsole
popř.:
ipython3 qtconsole
Obrázek 18: Bublinová nápověda je jednou z vylepšení Qt Console oproti klasickému interaktivnímu interpretru.
7. Zobrazení grafů přímo v Qt Consoli
V případě, že se IPython Qt Console spustí následujícím příkazem:
ipython qtconsole --matplotlib inline
popř. opět:
ipython3 qtconsole --matplotlib inline
je možné přímo na plochu konzole vykreslovat grafy s využitím systému matplotlib. Prozatím bez podrobnějšího vysvětlení (to bude uvedeno v navazujícím článku) se podívejme, jak je možné jen několika příkazy zobrazit graf s průběhem funkce:
Obrázek 19: Vykreslení funkce s využitím pouhých pěti příkazů (z toho dva příkazy slouží k importu knihoven). Podrobnější informace budou uvedeny v navazujícím článku.
Poznámka: pokud by se při spouštění konzole neuvedl přepínač --matplotlib inline, zobrazil by se graf v samostatném okně, což je patrné z následujícího screenshotu:
Obrázek 20: Zobrazení průběhu funkce v samostatném okně (použit je balíček python-tk, tj. napojení na knihovnu Tk jazyka Tcl).
8. Rozdělení plochy Qt Console na několik samostatných terminálů
Idea terminálu, do něhož se interaktivně zadávají příkazy a postupně se zobrazuje jejich výsledek, je sice v mnoha oblastech velmi užitečná a oblíbená, ovšem například pro zobrazení nápovědy by bylo praktičtější si plochu terminálu rozdělit do většího množství podoken. V případě IPython Qt Console je to možné, protože při jejím spuštění je možné zadat i nepovinný parametr --paging, kterým se řídí rozdělení konzole vertikálně či horizontálně:
ipython3 qtconsole --paging=hsplit ipython3 qtconsole --paging=vsplit
Při použití Python 2.x pak:
ipython qtconsole --paging=hsplit ipython qtconsole --paging=vsplit
V této chvíli začne být aktivní menu View →Pager, v němž se nacházejí příkazy pro horizontální či vertikální rozdělení plochy terminálu. Podívejme se, jak v praxi obě možnosti vypadají:
Obrázek 21: Qt Console při vertikálním rozdělení svého okna.
Obrázek 22: Qt Console při horizontálním rozdělení svého okna
9. IPython Notebook
Třetím rozhraním k nástroji IPython je takzvaný IPython Notebook. Jedná se o propracované grafické uživatelské rozhraní implementované systémem klient-server, kde klientem je libovolný moderní webový prohlížeč a server je přímo součástí modulárního IPythonu. IPython notebook se spouští příkazem:
$ ipython3 notebook 2016-04-01 22:10:52.173 [NotebookApp] Using existing profile dir: '/home/tester/.config/ipython/profile_default' 2016-04-01 22:10:52.177 [NotebookApp] Using system MathJax 2016-04-01 22:10:52.185 [NotebookApp] Serving notebooks from local directory: /home/tester 2016-04-01 22:10:52.185 [NotebookApp] The IPython Notebook is running at: http://127.0.0.1:8888/ 2016-04-01 22:10:52.185 [NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
Povšimněte si, že se po zadání tohoto příkazu po chvíli na terminálu zobrazí URL, na níž je možné rozhraní notebooku najít (zde se konkrétně jedná o lokální adresu a port 8888. Alternativně lze IPython Notebook spustit s volbou --pylab inline, který zajistí, že se případné grafy budou vykreslovat přímo do okna prohlížeče:
ipython3 notebook --pylab inline
Obrázek 23: Grafické uživatelské rozhraní IPython Notebooku ihned po jeho spuštění.
10. Použití IPython Notebooku
Použitím IPython Notebooku se budeme podrobně zabývat příště, ovšem již dnes si můžeme ve stručnosti ukázat, jak se s tímto nástrojem pracuje. Je to ve skutečnosti velmi jednoduché, protože po výběru diáře (lze jich vytvořit a sdílet libovolné množství) se příkazy zapisují do takzvaných buněk (cell) a klávesovou zkratkou Shift+Enter se tyto příkazy následně spouští (a to v libovolném pořadí):
Obrázek 24: Takto vypadá prázdný diář. Šedá plocha představuje buňku, do které je možné zadávat příkazy.
Obrázek 25: Zápis příkazů, včetně podpory pro zobrazení bublinové nápovědy.
Jednotlivé diáře se ukládají do lokálního souboru a jejich výchozím formátem je datová struktura uložená v JSONu. Jen pro zajímavost se podívejme, jak tato struktura vypadá pro náš příklad (vynechám jen vložený rastrový obrázek s grafem):
{ "metadata": { "name": "" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "code", "collapsed": false, "input": [ "import matplotlib.pyplot as plot" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 2 }, { "cell_type": "code", "collapsed": false, "input": [ "import numpy as np" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 3 }, { "cell_type": "code", "collapsed": false, "input": [ "x=np.linspace(0,1)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 4 }, { "cell_type": "code", "collapsed": false, "input": [ "y=np.sin(5*x)/(x+0.5)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 14 }, { "cell_type": "code", "collapsed": false, "input": [ "plot.plot(x,y)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 15, "text": [ "[<matplotlib.lines.Line2D at 0x7f9e542709e8>]" ] }, { "metadata": {}, "output_type": "display_data", "png": "data obrazku, uriznuto" "text": [ "<matplotlib.figure.Figure at 0x7f9e542ef550>" ] } ], "prompt_number": 15 } ], "metadata": {} } ] }
Obrázek 26: Zobrazení grafu (průběhu funkce) přímo v okně prohlížeče.
11. Předchozí části seriálu
- Vývojová prostředí ve Fedoře (1. díl)
http://mojefedora.cz/vyvojova-prostredi-ve-fedore-1-dil/ - Vývojová prostředí ve Fedoře (2. díl)
http://mojefedora.cz/vyvojova-prostredi-ve-fedore-2-dil/ - Vývojová prostředí ve Fedoře (3. díl)
http://mojefedora.cz/vyvojova-prostredi-ve-fedore-3-dil/ - Vývojová prostředí ve Fedoře (4. díl)
http://mojefedora.cz/vyvojova-prostredi-ve-fedore-4-dil/ - Integrovaná vývojová prostředí ve Fedoře: PyDev
http://mojefedora.cz/integrovana-vyvojova-prostredi-ve-fedore-pydev/ - Integrovaná vývojová prostředí ve Fedoře: PyDev (2.část)
http://mojefedora.cz/integrovana-vyvojova-prostredi-ve-fedore-pydev-2-cast/
12. Odkazy na Internetu
- IPython homepage
http://ipython.org/ - Dokumentace k IPythonu
http://ipython.org/documentation.html# - IPython Tutorial
http://ipython.readthedocs.org/en/stable/interactive/tutorial.html - NumPy Home Page
http://www.numpy.org/ - NumPy (Wikipedia)
https://en.wikipedia.org/wiki/NumPy - Matplotlib Home Page
http://matplotlib.org/ - matplotlib (Wikipedia)
https://en.wikipedia.org/wiki/Matplotlib - The cell magics in IPython
http://nbviewer.jupyter.org/github/ipython/ipython/blob/1.x/examples/notebooks/Cell%20Magics.ipynb - 0MQ Home Page
http://zeromq.org/ - 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 - Direct mode
https://en.wikipedia.org/wiki/Direct_mode - Seznámení s Python IDE Spyder (článek vyšel zde na mojefedora.cz)
http://mojefedora.cz/seznameni-s-python-ide-spyder/ - Stránka s popisem různých IDE pro Python
http://quintagroup.com/cms/python/ide - Eclipse (stránka o frameworku na Fedoraproject.org)
https://fedoraproject.org/wiki/Eclipse - PyDev (hlavní stránka)
http://pydev.sourceforge.net/index.html - PyDev (download, v podstatě není zapotřebí)
http://pydev.sourceforge.net/download.html - PyDev (stránka s metainformacemi o PyDev pluginu, použita v Eclipse)
http://www.pydev.org/updates/ - PyDev (stránka s pluginem, použita v Eclipse)
https://dl.bintray.com/fabioz/pydev/4.5.4/ - Certifikát, který lze do Eclipse doinstalovat
http://www.pydev.org/pydev_certificate.cer - PyDev FAQ
http://pydev.sourceforge.net/faq.html - PyDev (Wikipedia)
https://en.wikipedia.org/wiki/PyDev - Python (oficiální stránky projektu)
https://www.python.org/ - Jython
http://www.jython.org/ - IronPython
http://ironpython.net/ - Python 3.5.1 documentation
https://docs.python.org/3/ - PyDev: Unittest integration
http://mojefedora.cz/integrovana-vyvojova-prostredi-ve-fedore-pydev/ - Continuous unit testing with Pydev (Python and Eclipse)
http://stackoverflow.com/questions/1015581/continuous-unit-testing-with-pydev-python-and-eclipse - Test-driven development
https://en.wikipedia.org/wiki/Test-driven_development