Obsah
1. Projekty vylepšující interaktivní režim Pythonu: bpython, ptpython, DreamPie a IPython
2. První používaný koncept: klasická integrovaná vývojová prostředí
3. Alternativní koncepty: interaktivní smyčka REPL a diář (notebook)
4. Interaktivní smyčka REPL v různých jazycích a nástrojích
7. Příklady možností nabízených projektem bpython
10. Příklady možností nabízených projektem ptpython
12. Instalace balíčku dreampie
13. Ukázky použití projektu DreamPie
14. IPython ve funkci alternativního konceptu vývojového prostředí
16. Interaktivní rozhraní IPythonu
17. IPython Qt Console aneb vylepšený pseudoterminál
18. Který projekt si nakonec vybrat?
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.
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:
%
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:
- Zvýraznění syntaxe přímo při zápisu jednotlivých řádků, které se mají interaktivně spustit. Pro tento účel se používá knihovna Pygments.
- Plná podpora pro editaci prováděnou v rámci příkazového řádku založená na běžných a často používaných zkratkách převzatých z Emacsu.
- Automatické odsazení řádků, které se nachází uvnitř smyček, podmínek, deklarací funkcí, deklarací tříd atd.
- Možnost zápisu příkazů a deklarací v textovém editoru.
- Zobrazení seznamu klíčových slov a funkcí začínajících již zapsaným prefixem (v tomto případě bez nutnosti použití klávesové zkratky).
- Automatické doplnění klíčového slova či funkce s využitím klávesyTab ze zobrazené nabídky.
- Zobrazení nápovědy s parametry volané funkce nebo metody ihned po zápisu otevírací závorky.
- Samozřejmě je podporován i Python 3.x (což už by dnes měl být standard).
- Dále tento projekt nabízí možnost získat historii zapsaných příkazů a znovu je zavolat popř. je nějakým způsobem modifikovat.
- Užitečná je i další vlastnost – automatické poslání části zapsaného kódu do služby typu „pastebin“, takže lze velmi snadno kód nasdílet s kolegy (což samozřejmě nijak nenahrazuje plnohodnotný systém pro správu verzí :-).
- A samozřejmě je možné zapsaný a otestovaný kód uložit do souboru pro jeho další znovupoužití.
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
Po instalaci si samozřejmě můžeme zkontrolovat, zda je nástroj bpython spustitelný:
$ whereis bpython bpython: /home/tester/.local/bin/bpython
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.
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:
- Ve spodní části terminálu je zobrazena stavová řádka, která kontextově mění svůj obsah.
- Podporováno je zvýrazňování syntaxe zapisovaných příkazů a deklarací. I v tomto případě se pro tyto účely využívá knihovna Pygments.
- Dále tento projekt používá knihovnu Jedi, která (mimo jiné) umožňuje zobrazení kontextových menu s nabídkou metod pro zapsané jméno objektu.
- Stejná knihovna (Jedi) je použita pro doplnění klíčových slov, jmen funkcí, názvů metod apod.
- Ve výchozím nastavení je umožněna plnohodnotná editace příkazového řádku s využitím klávesových zkratek odvozených od textového editoru Emacs (a používaných v mnoha dalších shellech, například v BASHi, pokud ho nepřepneme do jiného režimu).
- V Emacs režimu se na stavové řádce zobrazují některé dostupné příkazy (například při stisku Ctrl+Space pro práci s výběrem).
- Klávesovou zkratkou F4 se můžeme prakticky kdykoli přepnout do režimu emulujícího chování modálních editorů Vi a Vim. Podporovány jsou prakticky všechny základní editační příkazy.
- Podporován je i záznam maker s jejich pozdějším přehráváním. V režimu Vi/Vim se záznam spustí zkratkou q_písmeno_, přehrání makra pak zkratkou @_písmeno.
- Existuje i speciální režim pro vkládání textu přes schránku a podpora pro práci s myší (ovšem podle toho, zda terminál práci s myší umožňuje).
- Stiskem klávesy F2 se zobrazí přehledný konfigurační dialog.
- Při vyhledávání v historii příkazů přes Ctrl+R se zobrazí všechny nalezené shody.
- Barvová schémata jsou konfigurovatelná.
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
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]:
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.
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
- What is REPL?
https://pythonprogramminglanguage.com/repl/ - What is a REPL?
https://codewith.mu/en/tutorials/1.0/repl - Programming at the REPL: Introduction
https://clojure.org/guides/repl/introduction - What is REPL? (Quora)
https://www.quora.com/What-is-REPL - Gorilla REPL: interaktivní prostředí pro programovací jazyk Clojure
https://www.root.cz/clanky/gorilla-repl-interaktivni-prostredi-pro-programovaci-jazyk-clojure/ - Read-eval-print loop (Wikipedia)
https://en.wikipedia.org/wiki/Read%E2%80%93eval%E2%80%93print_loop - Domovská stránka programovacího jazyka Python
https://www.python.org/ - Domovská stránka projektu bpython
https://bpython-interpreter.org/ - Projekt bpython na PyPi
https://pypi.org/project/bpython/ - Git repositář projektu bpython
https://github.com/bpython/bpython - Projekt ptpython na PyPi
https://pypi.org/project/ptpython/ - Git repositář projektu ptpython
https://github.com/prompt-toolkit/ptpython - Domovská stránka projektu DreamPie
http://www.dreampie.org/ - Projekt DreamPie na PyPi
https://pypi.org/project/dreampie/ - Git repositář projektu DreamPie
https://github.com/noamraph/dreampie - Domovská stránka projektu IPython
https://ipython.org/ - IPython (Wikipedia)
https://en.wikipedia.org/wiki/IPython - Projekt IPython na PyPi
https://pypi.org/project/ipython/ - Dokumentace k IPythonu
http://ipython.org/documentation.html# - IPython Tutorial
http://ipython.readthedocs.org/en/stable/interactive/tutorial.html - Integrovaná vývojová prostředí ve Fedoře: IPython a IPython Notebook
http://mojefedora.cz/integrovana-vyvojova-prostredi-ve-fedore-ipython-a-ipython-notebook/ - Integrovaná vývojová prostředí ve Fedoře: praktické použití IPython Notebooku a knihovny Numpy
http://mojefedora.cz/integrovana-vyvojova-prostredi-ve-fedore-prakticke-pouziti-ipython-notebooku-a-knihovny-numpy/ - Integrovaná vývojová prostředí ve Fedoře: praktické použití IPython Notebooku a knihovny Numpy (2.část)
http://mojefedora.cz/integrovana-vyvojova-prostredi-ve-fedore-prakticke-pouziti-ipython-notebooku-a-knihovny-numpy-2-cast/ - Integrovaná vývojová prostředí ve Fedoře: vykreslování grafů s využitím knihoven Numpy a matplotlib
http://mojefedora.cz/integrovana-vyvojova-prostredi-ve-fedore-vykreslovani-grafu-s-vyuzitim-knihoven-numpy-a-matplotlib/ - Integrovaná vývojová prostředí ve Fedoře: vykreslování grafů s využitím knihoven Numpy a matplotlib (2.část)
http://mojefedora.cz/integrovana-vyvojova-prostredi-ve-fedore-vykreslovani-grafu-s-vyuzitim-knihoven-numpy-a-matplotlib-2-cast/ - Is IPython Notebook ever used as an IDE, or merely for presentations?
https://www.reddit.com/r/IPython/comments/1uk7hp/is_ipython_notebook_ever_used_as_an_ide_or_merely/ - The IDE as a Bad Programming Language Enabler
https://dzone.com/articles/ide-bad-programming-language - Enhanced Interactive Python with IPython
http://www.onlamp.com/pub/a/python/2005/01/27/ipython.html - Příkazový řádek – přítel nejvěrnější
https://www.root.cz/clanky/prikazovy-radek-pritel-nejvernejsi/ - Příkazový řádek – přítel nejvěrnější (2)
https://www.root.cz/clanky/prikazovy-radek-pritel-nejvernejsi-2/ - Picking a Python Interpreter (3 vs 2)
https://docs.python-guide.org/starting/which-python/ - Využití knihovny Pygments (nejenom) pro obarvení zdrojových kódů
https://www.root.cz/clanky/vyuziti-knihovny-pygments-nejenom-pro-obarveni-zdrojovych-kodu/ - Využití knihovny Pygments (nejenom) pro obarvení zdrojových kódů: vlastní filtry a lexery
https://www.root.cz/clanky/vyuziti-knihovny-pygments-nejenom-pro-obarveni-zdrojovych-kodu-vlastni-filtry-a-lexery/ - Knihovna Jedi: doplňování kódu a statická analýza kódu v Pythonu
https://www.root.cz/clanky/knihovna-jedi-doplnovani-kodu-a-staticka-analyza-kodu-v-pythonu/ - Knihovna Jedi: doplňování kódu a statická analýza kódu v Pythonu (dokončení)
https://www.root.cz/clanky/knihovna-jedi-doplnovani-kodu-a-staticka-analyza-kodu-v-pythonu-dokonceni/ - Pygments – Python syntax highlighter
http://pygments.org/ - Pygments (dokumentace)
http://pygments.org/docs/ - Write your own lexer
http://pygments.org/docs/lexerdevelopment/ - Jazyky podporované knihovnou Pygments
http://pygments.org/languages/ - Pygments FAQ
http://pygments.org/faq/ - Pygments 2.2.0 (na PyPi)
https://pypi.org/project/Pygments/ - Syntax highlighting
https://en.wikipedia.org/wiki/Syntax_highlighting - Jedi – an awesome autocompletion/static analysis library for Python
https://jedi.readthedocs.io/en/latest/index.html - Jedi API Overview
https://jedi.readthedocs.io/en/latest/docs/api.html - jedi-vim
https://github.com/davidhalter/jedi-vim - Tvorba textového rozhraní s knihovnou prompt_toolkit: základní prvky TUI
https://www.root.cz/clanky/tvorba-textoveho-rozhrani-s-knihovnou-prompt-toolkit-zakladni-prvky-tui/ - Tvorba TUI s knihovnou prompt_toolkit: aplikace s celoobrazovkovým rozhraním
https://www.root.cz/clanky/tvorba-tui-s-knihovnou-prompt-toolkit-aplikace-s-celoobrazovkovym-rozhranim/ - Tvorba textového uživatelského rozhraní s knihovnou prompt_toolkit: ovládací prvky (widgety)
https://www.root.cz/clanky/tvorba-textoveho-uzivatelskeho-rozhrani-s-knihovnou-prompt-toolkit-ovladaci-prvky-widgety/ - ØMQ: knihovna pro asynchronní předávání zpráv
https://www.root.cz/clanky/0mq-knihovna-pro-asynchronni-predavani-zprav/ - Další možnosti poskytované knihovnou ØMQ
https://www.root.cz/clanky/dalsi-moznosti-poskytovane-knihovnou-mq/ - What is the difference between Jupyter and IPython Notebook?
https://www.quora.com/What-is-the-difference-between-Jupyter-and-IPython-Notebook