Hlavní navigace

Projekty vylepšující interaktivní režim Pythonu: bpython, ptpython, DreamPie a IPython

Pavel Tišnovský

Dnes se seznámíme se čtveřicí projektů, které se snaží – každý ovšem poněkud jinak – vylepšit původní interpret jazyka Python, přesněji řečeno interpret, jenž je nedílnou součástí CPythonu jak verze 2.x, tak i 3.x

Doba čtení: 26 minut

Sdílet

11. Projekt DreamPie

12. Instalace balíčku dreampie

13. Ukázky použití projektu DreamPie

14. IPython ve funkci alternativního konceptu vývojového prostředí

15. Instalace balíčku ipython

16. Interaktivní rozhraní IPythonu

17. IPython Qt Console aneb vylepšený pseudoterminál

18. Který projekt si nakonec vybrat?

19. Odkazy na Internetu

1. Projekty vylepšující interaktivní režim Pythonu: bpython, ptpython, DreamPie a IPython

Pravděpodobně všichni vývojáři, kteří jazyk Python používají, se seznámili s interaktivním režimem Pythonu. Tento režim, který se taktéž někdy nazývá smyčka REPL (což je zkratka vycházející z plného označení Read-Eval-Print-Loop, které pochází z 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 mezipřekladem do bajtkódu). Samotná 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á, ovšem můžeme si taktéž nechat zobrazit nápovědu, začít deklaraci funkce či třídy atd.

Obrázek 1: Interaktivní smyčka REPL programovacího jazyka Python verze 2.7.6.

Ovšem samotný standardní REPL má některá omezení. Sice umožňuje doplnění klíčového slova nebo jména funkce/metody klávesou TAB, ovšem již nedokáže nabídnout seznam metod po zápisu jména objektu. 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í velkou roli, dosti nepříjemné:

>>> def x():
... pass
  File "<stdin>", line 2
    pass
       ^
IndentationError: expected an indented block

Dále popsané projekty tyto problémy řeší a navíc uživatelům nabízí i mnohé další funkce.

Obrázek 2: Interaktivní smyčka REPL programovacího jazyka Python verze 3.6.3 (což je již postarší verze).

2. První používaný koncept: klasická integrovaná vývojová prostředí

Klasická integrovaná vývojová prostředí jsou většinou určena pro práci na rozsáhlejších projektech, které se skládají z mnoha zdrojových souborů a většinou mají i poměrně košatou hierarchii modulů a tříd (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 uživatelé-vývojáři většinou požadují především co nejsnadnější orientaci ve zpracovávaném projektu, dále funkce pro 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ů, podporu pro ladění vznikajících aplikací (integrovaný debugger či dokonce profiler) a popř. i integraci s nástroji pro testování a refaktoring zdrojových kódů. V případě Pythonu se navíc většinou očekává i integrace s interaktivní smyčkou REPL Pythonu.

Obrázek 3: Jedna z mnoha možností nabízená integrovaným vývojovým prostředím PyDev (založeno na Eclipse): spouštění jednotkových testů se zobrazením výsledků.

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, mezi které patří 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). Z novějších prostředí jmenujme dnes velmi populární Visual Studio Code.

Obrázek 4: I pokročilý textový editor Atom je možné nakonfigurovat do podoby (jednoduchého) integrovaného vývojového prostředí.

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í naopak není jejich hlavní pracovní náplní), však mohou preferovat dosti odlišný způsob práce, který je v mnohem větší míře založen na přímočaré a prakticky neustálé interakci mezi vývojářem a systémem nebo vznikající (mini)aplikací, jež je mnohdy vysoce jednoúčelová. V takových případech ustupuje správa projektů poněkud do pozadí a naopak se začíná využívat dosti odlišný druh vývojového prostředí založený buď na již v úvodním odstavci zmíněné 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, symbolickou matematiku (manipulace se symboly a výrazy, integrace, derivace, zjednodušování výrazů atd.) a dnes taktéž pro machine learning (ML).

Obrázek 5: Za zjednodušenou formu interaktivní smyčky REPL je možné považovat i takzvaný přímý mód (direct mode) použitý například v klasickém 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é definice, deklarace, makra a příkazy. To uživatelům umožňuje se snadněji a taktéž většinou i mnohem 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 (se všemi z toho plynoucími důsledky). Aplikace vytvářené v takto koncipovaných prostředích většinou vznikají systémem zdola-nahoru (to se někdy označuje termínem bottom-up programming), tj. postupně se skládají z funkcí a tříd, které mohou být ihned po své deklaraci interaktivně 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.

Poznámka: s konceptem „notebooku“ jsme se již na stránkách Rootu několikrát setkali, například při popisu projektu Gorilla určeného pro jazyk Clojure zmíněného na předchozím screenshotu. Ovšem mnohem známějším projektem je dále zmíněný IPython popř. jeho ideový následovník projekt Jupyter notebook (původně se jmenoval IPython Notebook, ovšem později došlo k rozšíření o další vlastnosti, které nejsou specifické pouze pro Python).

Obrázek 7: Textové rozhraní IPythonu, který je zde založen na starším interpretru Pythonu 2.7.x. V dalším textu se pochopitelně budeme zabývat především novější verzí 3.x.

4. Interaktivní smyčka REPL v různých jazycích a nástrojích

S principem a použitím interaktivní smyčky REPL jsme se již na stránkách Rootu setkali, a to dokonce mnohokrát. Kromě článků, které se věnovaly klasickým Unixovým shellům typu BASH, tcsh či zsh (a rozhraní shellů není nic jiného, než interaktivní REPL), jsme smyčku REPL použili například při popisu programovacího jazyka Julia či jazyka Clojure. Historií vzniku REPL jsme se zabývali i zde.

Některé smyčky REPL jsou pojaty přísně minimalisticky, což je případ dnes již spíše minimálně používaného jazyka TCL. Tato interaktivní REPL dokonce ani neobsahuje historii příkazů či podporu pro pohyb kurzoru na příkazovém řádku:

%
Poznámka: povšimněte si, že se liší i znak výzvy (prompt), protože se namísto obvyklého > používá znak procenta; to je ovšem pouze marginální změna.

Další interaktivní REPL alespoň uživatele informují, v jakém prostředí se nachází. To je případ REPL (opět velmi jednoduše pojaté) programovacího jazyka Lua:

Lua 5.2.3  Copyright (C) 1994-2013 Lua.org, PUC-Rio
>

REPL projektu LuaJIT vypadá nepatrně odlišně:

LuaJIT 2.1.0-beta3 -- Copyright (C) 2005-2017 Mike Pall. http://luajit.org/
JIT: ON SSE2 SSE3 SSE4.1 BMI2 fold cse dce fwd dse narrow loop abc sink fuse
>

Nově se plnohodnotný REPL objevil i v jazyku Clojure; v předchozích verzích se používal dále zmíněný alternativní nREPL:

Clojure 1.9.0
user=>

Podobně vypadá REPL programovacího jazyka Pixie (to vlastně není nijak překvapivé, protože se opět jedná o jednu z v:

user =>

Interaktivní rozhraní projektu GNU Guile, což je jedna z variant programovacího jazyka Scheme:

GNU Guile 2.0.14
Copyright (C) 1995-2016 Free Software Foundation, Inc.
 
Guile comes with ABSOLUTELY NO WARRANTY; for details type `,show w'.
This program is free software, and you are welcome to redistribute it
under certain conditions; type `,show c' for details.
 
Enter `,help' for help.
scheme@(guile-user)>

Plnohodnotnou smyčku REPL se všemi vymoženostmi nabízí zejména programovací jazyk Julia, což ostatně není překvapivé, protože se tento jazyk používá právě pro postupnou inkrementální tvorbu aplikací v interaktivním prostředí:

               _
   _       _ _(_)_     |  Documentation: https://docs.julialang.org
  (_)     | (_) (_)    |
   _ _   _| |_  __ _   |  Type "?" for help, "]?" for Pkg help.
  | | | | | | |/ _` |  |
  | | |_| | | | (_| |  |  Version 1.0.0 (2018-08-08)
 _/ |\__'_|_|_|\__'_|  |  Official https://julialang.org/ release
|__/                   |
 
julia>

Podobně je tomu v případě programovacího jazyka Clojure doplněného o nREPL (ten lze spustit například příkazem lein repl):

nREPL server started on port 42733 on host 127.0.0.1 - nrepl://127.0.0.1:42733
REPL-y 0.3.7, nREPL 0.2.12
Clojure 1.8.0
OpenJDK 64-Bit Server VM 1.8.0_171-b10
    Docs: (doc function-name-here)
          (find-doc "part-of-name-here")
  Source: (source function-name-here)
 Javadoc: (javadoc java-object-or-class-here)
    Exit: Control+D or (exit) or (quit)
 Results: Stored in vars *1, *2, *3, an exception in *e
 
user=>

Samozřejmě nesmíme zapomenout ani na REPL doménově specifického jazyka R:

R version 3.5.3 (2019-03-11) -- "Great Truth"
Copyright (C) 2019 The R Foundation for Statistical Computing
Platform: x86_64-redhat-linux-gnu (64-bit)
 
R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.
 
  Natural language support but running in an English locale
 
R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.
 
Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.
 
During startup - Warning messages:
1: Setting LC_TIME failed, using "C"
2: Setting LC_MONETARY failed, using "C"
3: Setting LC_PAPER failed, using "C"
4: Setting LC_MEASUREMENT failed, using "C"
gt;

5. Projekt bpython

Po delším úvodu se konečně dostáváme k těm projektům, které se snaží původní interaktivní režim programovacího jazyka Python nějakým způsobem vylepšit. 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:

  1. 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.
  2. 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.
  3. Automatické odsazení řádků, které se nachází uvnitř smyček, podmínek, deklarací funkcí, deklarací tříd atd.
  4. Možnost zápisu příkazů a deklarací v textovém editoru.
  5. 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).
  6. Automatické doplnění klíčového slova či funkce s využitím klávesyTab ze zobrazené nabídky.
  7. Zobrazení nápovědy s parametry volané funkce nebo metody ihned po zápisu otevírací závorky.
  8. Samozřejmě je podporován i Python 3.x (což už by dnes měl být standard).
  9. 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.
  10. 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í :-).
  11. A samozřejmě je možné zapsaný a otestovaný kód uložit do souboru pro jeho další znovupoužití.

Příklad použití jednotlivých operací bude popsán v navazujících kapitolách.

Obrázek 8: Takto vypadá základní uživatelské rozhraní projektu bpython.

6. Instalace balíčku bpython

Balíček bpython, který nalezneme na seznamu balíčků PyPi, je možné velmi snadno nainstalovat s využitím nástroje pip popř. pip3. Zde konkrétně jsem použil nástroj pip3 s přepínačem –user zajišťující instalaci pouze pro aktivně přihlášeného uživatele (kterým je „tester“). Instalace se provede do adresáře ~/.local:

$ pip3 install --user bpython
 
Collecting bpython
  Using cached https://files.pythonhosted.org/packages/c7/0c/22459d1c7f45faada154b9bb4e04c0000b9cc691cd232b7915667f0a4574/bpython-0.18-py2.py3-none-any.whl
Requirement already satisfied: curtsies>=0.1.18 in /home/tester/.local/lib/python3.6/site-packages (from bpython)
Requirement already satisfied: six>=1.5 in /home/tester/.local/lib/python3.6/site-packages (from bpython)
Requirement already satisfied: pygments in /home/tester/.local/lib/python3.6/site-packages (from bpython)
Requirement already satisfied: requests in /usr/lib/python3.6/site-packages (from bpython)
Requirement already satisfied: greenlet in /home/tester/.local/lib/python3.6/site-packages (from bpython)
Requirement already satisfied: blessings>=1.5 in /home/tester/.local/lib/python3.6/site-packages (from curtsies>=0.1.18->bpython)
Requirement already satisfied: wcwidth>=0.1.4 in /home/tester/.local/lib/python3.6/site-packages (from curtsies>=0.1.18->bpython)
Requirement already satisfied: typing in /home/tester/.local/lib/python3.6/site-packages (from curtsies>=0.1.18->bpython)
Requirement already satisfied: urllib3==1.20 in /usr/lib/python3.6/site-packages (from requests->bpython)
Installing collected packages: bpython
Successfully installed bpython-0.18
Poznámka: povšimněte si, že tento nástroj interně používá knihovnu Pygments, s níž jsme se již na stránkách Rootu setkali v článcích Využití knihovny Pygments (nejenom) pro obarvení zdrojových kódů a Využití knihovny Pygments (nejenom) pro obarvení zdrojových kódů: vlastní filtry a lexery .

Po instalaci si samozřejmě můžeme zkontrolovat, zda je nástroj bpython spustitelný:

$ whereis bpython
 
bpython: /home/tester/.local/bin/bpython
Poznámka: v případě, že whereis nástroj bpython nenalezne, zkontrolujte, zda je cesta .local součástí obsahu proměnné prostředí PATH. Nastavení lze provést například v konfiguračním souboru ~/.bash_profile, a to přidáním následujícího řádku:
PATH=$PATH:$HOME/.local/bin:$HOME/bin

7. Příklady možností nabízených projektem bpython

V této kapitole si na několika screenshotech ukážeme některé možnosti, které nám projekt bpython nabízí a které většinou ve standardním interpretru Pythonu nenalezneme:

Obrázek 9: Takto vypadá uživatelské rozhraní ihned po spuštění upraveného interpretru.

Obrázek 10: 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 11: Návrat z textového editoru zpět do prostředí REPLu. Vytvořený text se automaticky vložil do interpretru.

Obrázek 12: Potvrzení příkazu a zobrazení jeho výsledku (pokud je pochopitelně viditelný).

Obrázek 13: Po zápisu prvního znaku či několika znaků klíčového slova či názvu funkce se automaticky nabídnou všechny možnosti začínající zapsaným prefixem.

Obrázek 14: Zobrazení seznamu parametrů funkce a taktéž dokumentace k volané funkci (provádí se automaticky bez nutnosti stisku jakékoli klávesové zkratky).

Obrázek 15: Klávesovou zkratkou F8 je možné buffer přenést do vybrané služby typu „pastebin“. REPL současně zobrazí adresu, na které se zkopírovaný text nachází.

Obrázek 16: Takto vypadá zkopírovaný buffer, který mohou vidět kolegové (ovšem i kolemjdoucí).

Obrázek 17: Další příklad zobrazení nápovědy k funkci a jejím parametrům.

Obrázek 18: Dokumentační řetězec se pochopitelně zobrazí i pro uživatelsky definovanou funkci.

Poznámka: některé možnosti nelze zobrazit na statickém screenshotu. Jedná se především o plnohodnotnou editaci v rámci příkazového řádku.

8. Projekt ptpython

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:

  1. Ve spodní části terminálu je zobrazena stavová řádka, která kontextově mění svůj obsah.
  2. 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.
  3. 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.
  4. Stejná knihovna (Jedi) je použita pro doplnění klíčových slov, jmen funkcí, názvů metod apod.
  5. 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).
  6. 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).
  7. 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.
  8. 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.
  9. 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).
  10. Stiskem klávesy F2 se zobrazí přehledný konfigurační dialog.
  11. Při vyhledávání v historii příkazů přes Ctrl+R se zobrazí všechny nalezené shody.
  12. Barvová schémata jsou konfigurovatelná.

9. Instalace balíčku ptpython

I projekt ptpython nalezneme, podobně jako výše zmíněný projekt bpython, přímo na stránkách PyPi, takže instalace bude stejně snadná, jako v případě bpythonu. Opět instalaci provedeme pouze pro přihlášeného uživatele, takže ani nebudeme potřebovat práva roota:

$ pip3 install --user ptpython
 
Collecting ptpython
  Downloading https://files.pythonhosted.org/packages/01/16/5260314dbc2a03792e277e67578fee099ae1770db58d4f7fdda03225aef9/ptpython-2.0.4-py3-none-any.whl (47kB)
    100% |████████████████████████████████| 51kB 796kB/s
Requirement already satisfied: pygments in /home/tester/.local/lib/python3.6/site-packages (from ptpython)
Requirement already satisfied: prompt-toolkit<2.1.0,>=2.0.6 in /home/tester/.local/lib/python3.6/site-packages (from ptpython)
Requirement already satisfied: jedi>=0.9.0 in /home/tester/.local/lib/python3.6/site-packages (from ptpython)
Requirement already satisfied: docopt in /usr/lib/python3.6/site-packages (from ptpython)
Requirement already satisfied: wcwidth in /home/tester/.local/lib/python3.6/site-packages (from prompt-toolkit<2.1.0,>=2.0.6->ptpython)
Requirement already satisfied: six>=1.9.0 in /home/tester/.local/lib/python3.6/site-packages (from prompt-toolkit<2.1.0,>=2.0.6->ptpython)
Requirement already satisfied: parso>=0.3.0 in /home/tester/.local/lib/python3.6/site-packages (from jedi>=0.9.0->ptpython)
Installing collected packages: ptpython
Successfully installed ptpython-2.0.4
Poznámka: zde si povšimněte, že tento projekt používá knihovnu Jedi, která pro nás opět není žádná novinka, neboť ji známe z dvojice článků Knihovna Jedi: doplňování kódu a statická analýza kódu v Pythonu a Knihovna Jedi: doplňování kódu a statická analýza kódu v Pythonu (dokončení).

10. Příklady možností nabízených projektem ptpython

Opět si ukažme některé možnosti, které projekt ptpython programátorům a vlastně i všem uživatelům Pythonu nabízí.

Obrázek 19: 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 20: 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 21: 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.

Obrázek 22: Nabídka klíčových slov a příkazů začínajících na zapsaný prefix.

Obrázek 23: Výběr klíčového slova nebo příkazu z nabídky.

Obrázek 24: V některých případech narazíme na omezení kontextové nabídky.

Obrázek 25: Spuštění příkazu se zobrazením jeho výsledku.

Obrázek 26: Další velmi užitečná vlastnost – výběr příkazů ze zapamatované historie s přesným určením, které části budeme chtít použít.

Obrázek 27: Návrat z dialogu s historií příkazů.

Obrázek 28: Kontrola základních syntaktických chyb přímo v prostředí interpretru.

Obrázek 29: Kontextová nabídka všech metod platných pro řetězec.

Obrázek 30: A obligátní otázka na závěr celé seance po stisku klávesy Ctrl+D.

11. Projekt DreamPie

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.

12. Instalace balíčku dreampie

Instalace tohoto balíčku může být problematická. V první řadě není dobré použít verzi určenou pro Python 3, protože s velkou pravděpodobností nebude funkční. Jednodušší je nainstalovat verzi pro Python 2, která ovšem umožňuje interně použít libovolný interpret (CPython 2, CPython 3, Jython, …). Samotná instalace může proběhnout přes nástroj pip:

$ pip install --user dreampie
 
Collecting dreampie
  Downloading https://files.pythonhosted.org/packages/1a/e1/aabfb33dd1d204c37f6858ccd7ba0de6f8ddfb02ca6d660fd8a12c6677ea/dreampie-1.2.1.tar.gz (168kB)
    100% |████████████████████████████████| 174kB 1.2MB/s
Installing collected packages: dreampie
  Running setup.py install for dreampie ... done
Successfully installed dreampie-1.2.1

Alternativně je možné v některých distribucích tento nástroj nainstalovat přímo z repositářů dané distribuce, například:

$ sudo dnf install dreampie
 
Dependencies resolved.
==========================================================================================================
 Package                      Arch                Version                       Repository           Size
==========================================================================================================
Installing:
 dreampie                     noarch              1.1.1-14.fc27                 fedora              203 k
Installing dependencies:
 gtksourceview2               x86_64              2.11.2-22.fc27                fedora              678 k
 libglade2                    x86_64              2.6.4-15.fc27                 fedora               66 k
 pycairo                      x86_64              1.10.0-6.fc27                 fedora              482 k
 pygobject2                   x86_64              2.28.6-17.fc27                fedora              226 k
 pygtk2                       x86_64              2.24.0-16.fc27                fedora              903 k
 pygtk2-libglade              x86_64              2.24.0-16.fc27                fedora               29 k
 pygtksourceview              x86_64              2.10.1-14.fc27                fedora               57 k
 python-xpyb                  x86_64              1.3.1-7.fc27                  fedora              138 k
 
Transaction Summary
==========================================================================================================
Install  9 Packages
 
Total download size: 2.7 M
Installed size: 11 M
Is this ok [y/N]:
Poznámka: v tomto případě se ovšem nainstaluje dosti stará verze projektu, která neobsahuje všechny novinky, které se v něm objevily předloni.

13. Ukázky použití projektu DreamPie

Opět se podívejme na některé možnosti, které nám projekt DreamPie nabízí:

Obrázek 31: Projekt DreamPie dokáže používat svá vlastní GUI okna, což je současně výhoda, ale i nevýhoda tohoto projektu.

Obrázek 32: Jeden z důvodů, proč je DreamPie založen na Pythonu 2.

Obrázek 33: Dialog s nastavením chování interaktivního prostředí.

Obrázek 34: Rozdělení okna terminálu na část s historií příkazů (i s výsledky) a na část, do níž se příkazy zapisují.

Obrázek 35: Nabídka s doplněním jména funkce.

Obrázek 36: Možnost skládání (foldingu) deklarací tak, aby nezabíraly větší plochu obrazovky.

Obrázek 37: Možnost skládání (foldingu) deklarací tak, aby nezabíraly větší plochu obrazovky.

Obrázek 38: Opětovné rozložení (unfolding) deklarace funkce.

14. IPython ve funkci alternativního konceptu vývojového prostředí

V závěrečné části dnešního č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ů (viz též článek o této knihovně).

Obrázek 39: Start interaktivního prostředí IPythonu.

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

Obrázek 40: Zobrazení nápovědy k funkci range.

15. Instalace balíčku ipython

Samotná instalace balíčku ipython se nijak neliší od instalace dříve popsaných balíčků bpython či ptpython. Opět použijeme nástroj pip3 a instalaci provedeme pro aktuálně přihlášeného uživatele:

$ pip3 install --user ipython
 
Collecting ipython
  Downloading https://files.pythonhosted.org/packages/46/b5/ca080401b8dbde51a0f4377b4e22ce02b266340a1cda389b6dea702d06d1/ipython-7.4.0-py3-none-any.whl (769kB)
    100% |████████████████████████████████| 778kB 1.1MB/s
Requirement already satisfied: jedi>=0.10 in /home/tester/.local/lib/python3.6/site-packages (from ipython)
Requirement already satisfied: pygments in /home/tester/.local/lib/python3.6/site-packages (from ipython)
Requirement already satisfied: pickleshare in /home/tester/.local/lib/python3.6/site-packages (from ipython)
Requirement already satisfied: traitlets>=4.2 in /home/tester/.local/lib/python3.6/site-packages (from ipython)
Requirement already satisfied: prompt-toolkit<2.1.0,>=2.0.0 in /home/tester/.local/lib/python3.6/site-packages (from ipython)
Requirement already satisfied: setuptools>=18.5 in /usr/lib/python3.6/site-packages (from ipython)
Requirement already satisfied: pexpect; sys_platform != "win32" in /home/tester/.local/lib/python3.6/site-packages (from ipython)
Requirement already satisfied: backcall in /home/tester/.local/lib/python3.6/site-packages (from ipython)
Requirement already satisfied: decorator in /usr/lib/python3.6/site-packages (from ipython)
Requirement already satisfied: parso>=0.3.0 in /home/tester/.local/lib/python3.6/site-packages (from jedi>=0.10->ipython)
Requirement already satisfied: six in /home/tester/.local/lib/python3.6/site-packages (from traitlets>=4.2->ipython)
Requirement already satisfied: ipython-genutils in /home/tester/.local/lib/python3.6/site-packages (from traitlets>=4.2->ipython)
Requirement already satisfied: wcwidth in /home/tester/.local/lib/python3.6/site-packages (from prompt-toolkit<2.1.0,>=2.0.0->ipython)
Requirement already satisfied: ptyprocess>=0.5 in /home/tester/.local/lib/python3.6/site-packages (from pexpect; sys_platform != "win32"->ipython)
Installing collected packages: ipython
Successfully installed ipython-7.4.0

16. 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 41: Klasický REPL Pythonu neprovádí automatické odsazení..

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 42: Automatické odsazení kódu v IPythonu.

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 43: Zobrazení nápovědy pro knihovnu request.

Obrázek 44: Nápověda knihovny requests.

17. 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 45: Grafické rozhraní IPythonu.

Diners Vánoce 2019

S dalšími možnostmi IPythonu, kterých je takřka nepřeberné množství, se seznámíme v samostatném článku.

18. Který projekt si nakonec vybrat?

Výběr projektu, který bude nejvíce vyhovovat potřebám uživatele, je samozřejmě silně individuální, ovšem lze říci, že pokud preferujete minimalističtěji pojatá řešení, může být ideálním kandidátem ptpython a pokud naopak potřebujete projekt s největšími možnostmi, nabízí se ipython. V případě bpythonu budete některé vlastnosti pravděpodobně postrádat a DreamPie se nachází ve stadiu údržby.

19. Odkazy na Internetu

  1. What is REPL?
    https://pythonprogramminglan­guage.com/repl/
  2. What is a REPL?
    https://codewith.mu/en/tu­torials/1.0/repl
  3. Programming at the REPL: Introduction
    https://clojure.org/guides/re­pl/introduction
  4. What is REPL? (Quora)
    https://www.quora.com/What-is-REPL
  5. Gorilla REPL: interaktivní prostředí pro programovací jazyk Clojure
    https://www.root.cz/clanky/gorilla-repl-interaktivni-prostredi-pro-programovaci-jazyk-clojure/
  6. Read-eval-print loop (Wikipedia)
    https://en.wikipedia.org/wi­ki/Read%E2%80%93eval%E2%80%93prin­t_loop
  7. Domovská stránka programovacího jazyka Python
    https://www.python.org/
  8. Domovská stránka projektu bpython
    https://bpython-interpreter.org/
  9. Projekt bpython na PyPi
    https://pypi.org/project/bpython/
  10. Git repositář projektu bpython
    https://github.com/bpython/bpython
  11. Projekt ptpython na PyPi
    https://pypi.org/project/ptpython/
  12. Git repositář projektu ptpython
    https://github.com/prompt-toolkit/ptpython
  13. Domovská stránka projektu DreamPie
    http://www.dreampie.org/
  14. Projekt DreamPie na PyPi
    https://pypi.org/project/dreampie/
  15. Git repositář projektu DreamPie
    https://github.com/noamraph/dreampie
  16. Domovská stránka projektu IPython
    https://ipython.org/
  17. IPython (Wikipedia)
    https://en.wikipedia.org/wiki/IPython
  18. Projekt IPython na PyPi
    https://pypi.org/project/ipython/
  19. Dokumentace k IPythonu
    http://ipython.org/documen­tation.html#
  20. IPython Tutorial
    http://ipython.readthedoc­s.org/en/stable/interacti­ve/tutorial.html
  21. Integrovaná vývojová prostředí ve Fedoře: IPython a IPython Notebook
    http://mojefedora.cz/integrovana-vyvojova-prostredi-ve-fedore-ipython-a-ipython-notebook/
  22. 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/
  23. 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/
  24. 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/
  25. 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/
  26. 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/
  27. The IDE as a Bad Programming Language Enabler
    https://dzone.com/articles/ide-bad-programming-language
  28. Enhanced Interactive Python with IPython
    http://www.onlamp.com/pub/a/pyt­hon/2005/01/27/ipython.html
  29. Příkazový řádek – přítel nejvěrnější
    https://www.root.cz/clanky/prikazovy-radek-pritel-nejvernejsi/
  30. Příkazový řádek – přítel nejvěrnější (2)
    https://www.root.cz/clanky/prikazovy-radek-pritel-nejvernejsi-2/
  31. Picking a Python Interpreter (3 vs 2)
    https://docs.python-guide.org/starting/which-python/
  32. Využití knihovny Pygments (nejenom) pro obarvení zdrojových kódů
    https://www.root.cz/clanky/vyuziti-knihovny-pygments-nejenom-pro-obarveni-zdrojovych-kodu/
  33. 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/
  34. 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/
  35. 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/
  36. Pygments – Python syntax highlighter
    http://pygments.org/
  37. Pygments (dokumentace)
    http://pygments.org/docs/
  38. Write your own lexer
    http://pygments.org/docs/le­xerdevelopment/
  39. Jazyky podporované knihovnou Pygments
    http://pygments.org/languages/
  40. Pygments FAQ
    http://pygments.org/faq/
  41. Pygments 2.2.0 (na PyPi)
    https://pypi.org/project/Pygments/
  42. Syntax highlighting
    https://en.wikipedia.org/wi­ki/Syntax_highlighting
  43. Jedi – an awesome autocompletion/static analysis library for Python
    https://jedi.readthedocs.i­o/en/latest/index.html
  44. Jedi API Overview
    https://jedi.readthedocs.i­o/en/latest/docs/api.html
  45. jedi-vim
    https://github.com/davidhalter/jedi-vim
  46. 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/
  47. 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/
  48. 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/
  49. ØMQ: knihovna pro asynchronní předávání zpráv
    https://www.root.cz/clanky/0mq-knihovna-pro-asynchronni-predavani-zprav/
  50. Další možnosti poskytované knihovnou ØMQ
    https://www.root.cz/clanky/dalsi-moznosti-poskytovane-knihovnou-mq/
  51. What is the difference between Jupyter and IPython Notebook?
    https://www.quora.com/What-is-the-difference-between-Jupyter-and-IPython-Notebook