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)

4. Představuje se IPython

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ů

9. IPython Notebook

10. Použití IPython Notebooku

11. Předchozí části seriálu

12. Odkazy na Internetu

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.).

01

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.

04_

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ů.

03

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).

04

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.).

05

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.

06

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ů.

07

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.

08

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ů):

09

Obrázek 9: IPython využívající interpret jazyka Python 2.x.

10

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í:

11

Obrázek 11: Chování klasického interpretru Pythonu při psaní vnořených bloků bez odsazení.

12

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:

13

Obrázek 13: Zobrazení podrobnějších informací o identifikátoru.

14

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:

15

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):

16

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.

17

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

18

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:

19

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:

20

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í:

21

Obrázek 21: Qt Console při vertikálním rozdělení svého okna.

22

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

23

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í):

24

Obrázek 24: Takto vypadá prázdný diář. Šedá plocha představuje buňku, do které je možné zadávat příkazy.

25

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": {}
  }
 ]
}

26

Obrázek 26: Zobrazení grafu (průběhu funkce) přímo v okně prohlížeče.

11. Předchozí části seriálu

  1. Vývojová prostředí ve Fedoře (1. díl)
    http://mojefedora.cz/vyvojova-prostredi-ve-fedore-1-dil/
  2. Vývojová prostředí ve Fedoře (2. díl)
    http://mojefedora.cz/vyvojova-prostredi-ve-fedore-2-dil/
  3. Vývojová prostředí ve Fedoře (3. díl)
    http://mojefedora.cz/vyvojova-prostredi-ve-fedore-3-dil/
  4. Vývojová prostředí ve Fedoře (4. díl)
    http://mojefedora.cz/vyvojova-prostredi-ve-fedore-4-dil/
  5. Integrovaná vývojová prostředí ve Fedoře: PyDev
    http://mojefedora.cz/integrovana-vyvojova-prostredi-ve-fedore-pydev/
  6. 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

  1. IPython homepage
    http://ipython.org/
  2. Dokumentace k IPythonu
    http://ipython.org/documentation.html#
  3. IPython Tutorial
    http://ipython.readthedocs.org/en/stable/interactive/tutorial.html
  4. NumPy Home Page
    http://www.numpy.org/
  5. NumPy (Wikipedia)
    https://en.wikipedia.org/wiki/NumPy
  6. Matplotlib Home Page
    http://matplotlib.org/
  7. matplotlib (Wikipedia)
    https://en.wikipedia.org/wiki/Matplotlib
  8. The cell magics in IPython
    http://nbviewer.jupyter.org/github/ipython/ipython/blob/1.x/examples/notebooks/Cell%20Magics.ipynb
  9. 0MQ Home Page
    http://zeromq.org/
  10. 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/
  11. The IDE as a Bad Programming Language Enabler
    https://dzone.com/articles/ide-bad-programming-language
  12. Enhanced Interactive Python with IPython
    http://www.onlamp.com/pub/a/python/2005/01/27/ipython.html
  13. Direct mode
    https://en.wikipedia.org/wiki/Direct_mode
  14. Seznámení s Python IDE Spyder (článek vyšel zde na mojefedora.cz)
    http://mojefedora.cz/seznameni-s-python-ide-spyder/
  15. Stránka s popisem různých IDE pro Python
    http://quintagroup.com/cms/python/ide
  16. Eclipse (stránka o frameworku na Fedoraproject.org)
    https://fedoraproject.org/wiki/Eclipse
  17. PyDev (hlavní stránka)
    http://pydev.sourceforge.net/index.html
  18. PyDev (download, v podstatě není zapotřebí)
    http://pydev.sourceforge.net/download.html
  19. PyDev (stránka s metainformacemi o PyDev pluginu, použita v Eclipse)
    http://www.pydev.org/updates/
  20. PyDev (stránka s pluginem, použita v Eclipse)
    https://dl.bintray.com/fabioz/pydev/4.5.4/
  21. Certifikát, který lze do Eclipse doinstalovat
    http://www.pydev.org/pydev_certificate.cer
  22. PyDev FAQ
    http://pydev.sourceforge.net/faq.html
  23. PyDev (Wikipedia)
    https://en.wikipedia.org/wiki/PyDev
  24. Python (oficiální stránky projektu)
    https://www.python.org/
  25. Jython
    http://www.jython.org/
  26. IronPython
    http://ironpython.net/
  27. Python 3.5.1 documentation
    https://docs.python.org/3/
  28. PyDev: Unittest integration
    http://mojefedora.cz/integrovana-vyvojova-prostredi-ve-fedore-pydev/
  29. Continuous unit testing with Pydev (Python and Eclipse)
    http://stackoverflow.com/questions/1015581/continuous-unit-testing-with-pydev-python-and-eclipse
  30. Test-driven development
    https://en.wikipedia.org/wiki/Test-driven_development