<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xml" href="/cjs/screen.xsl" media="screen"?>
<lecture>

<meta>
    <maintitle>Python</maintitle>
    <author>Jiří Znamenáček</author>
    <title>Instalace potřebných programů</title>
    <date>2020-05-21</date>
    <link><!--a href="http://vyuka.ookami.cz" rel="external">http://vyuka.ookami.cz</a--></link>
</meta>


<slide title="Úvod">
    
    <p>
        Z mnoha důvodů (z nichž některé ukážu na první přednášce), <strong>jediným funkčním způsobem jak pouštět pythoní programy je příkazová řádka</strong>. A to navzdory rozšíření profesionálních programátorských IDE<sup>*</sup> – věřte mi, že i v nich spousta věcí jednoduše nefunguje nebo funguje jinak.
    </p>
    <note>
        <sup>*</sup> IDE = <em>Integrated Development Environment</em>
    </note>
    <p>
        Ovšem příkazové řádky se netřeba bát, zase tak složitá – alespoň pro naše použití – není, a navíc základy Pythonu si budeme ukazovat v něčem příjemnějším, konkrétně nástroji <a href="http://dreampie.org" class="external"><em>Dreampie</em></a>. A ano, spousta věcí v něm funguje jinak než na příkazové řádce…
    </p>
    <p>
        Psát programy pak můžete buď v nějakém tom profesionálním nástroji (<a href="http://www.jetbrains.com/pycharm/" class="external"><em>PyCharm</em></a> má verzi zdarma, <em>Microsoft Visual Code</em> je také volný, škola má licenci i na větší nástroje), což pokládám – alespoň pro začátek – za naprosto zbytečné (ba spíš přímo škodlivé), nebo v obyčejném „programátorském“ textovém editoru. Ovšem pozor – <em>MS Office Word</em> a podobné to v žádném případě opravdu nejsou!
    </p>
    
</slide>
<slide title="Python I">
    
    <p>
        Pythoní programy se nejčastěji vyskytují ve formě tzv. <strong>skriptů</strong>, což jsou obyčejné textové soubory (převážně <a href="/materialy/text/encoding.xml">v kódování UTF-8</a>), jejichž obsah ovšem umí tzv. <em>interpretr</em> jazyka Python přečíst, pochopit a vykonat.
    </p>
    <p>
        Pro to je ovšem potřeba, abyste buď sami řekli, že obsah daného souboru má provést Python, nebo operační systém musí poznat, že na daný soubor má Python tak zvaně „zavolat“.
    </p>
    <p>
        Proto se pythoní skripty nejčastěji ukládají do souborů s příponou <em>*.py</em> (ačkoli jde vlastně o obyčejné texty a slušela by jim tak třebas koncovka <em>*.txt</em>; nebo žádná), přičemž operační systém ví, že takové soubory má „spouštět“ právě pomocí interpretru Pythonu.
    </p>
    <note>
        Asi jako operační systém <em>Windows</em> ví, že pro soubory s příponou <em>*.doc</em> má (pravděpodobně) zavolat program <em>MS Office Word</em>. <strong>Kdo používá <em>Průzkumník</em> a nevidí přípony souborů, tak si ho přenastavte, abyste je viděli!</strong>
    </note>
    
</slide>
<slide title="Python II">
    
    <p>
        Aby tedy všechno správně fungovalo, je nejsnažší mít v počítači jenom jeden „hlavní“ Python, který bude operační systém volat, pokud narazí na <em>py</em>-soubory.
    </p>
    <p>
        Nejpoužívanějším a nejnovější novinky obsahujícím (ne však nutně i nejvhodnějším na všechna použití!) je interpret <a href="https://python.org" class="external"><strong>CPython</strong></a>, aktuálně ve verzi <a href="https://www.python.org/downloads/release/python-3143/" class="external">3.14.3</a>.
    </p>
    <note>
        Pro <em>Windows 10 a 11, 64 bit</em> chcete stáhnout <a href="https://www.python.org/ftp/python/3.14.3/python-3.14.3-amd64.exe" class="external">Windows installer (64-bit)</a>. Nebo dnes už rovnou <a href="https://www.python.org/downloads/release/pymanager-260/" class="external"><em>Python install manager</em></a>.
    </note>
    <p>
        Na dalších stránkách si ukážeme, jak instalátor nastavit pro nejjednodušší možný případ – <strong>jeden jediný „hlavní“ Python pro jednoho uživatele</strong>. (Složitější případy už je třeba <a href="/materialy/python/packages/conda_overview.xml">řešit složitěji</a>.)
    </p>
    
</slide>
<slide title="PS: Kontrola instalačních souborů">

    <p>
        Než spustíte instalátor, měli byste si ověřit, že je skutečně tím, za co se vydává, a že se v něm neukrývají nějaké mršky viry nebo něco podobného. Na Linuxu jde vše celkem snadno provést z příkazové řádky, případně jsou k dispozici klikací grafické nástroje. Na Windows je to z příkazové řádky také možné – dnes typicky z prostředí <em>Power Shell</em>, ale samozřejmě na to existuje i hromada grafických nástrojů, byť je složitější najít vhodně.
    </p>
    <p>
        Prvním bodem kontroly je tzv. <strong>kontrolní součet</strong> (dnes typicky <a href="https://en.wikipedia.org/wiki/SHA-2" class="external">SHA256</a> a podobné). To je číslo, které je nějakým způsobem spočítané z binárních dat (instalačního) souboru a ideálně ho nějak reprezentuje.<sup>*</sup> Druhý bod kontroly – tzv. <strong>podpis kryptografickým klíčem</strong> (viz <a href="https://cs.wikipedia.org/wiki/Asymetrick%C3%A1_kryptografie" class="external">asymetrická kryptografie</a>, <a href="https://en.wikipedia.org/wiki/GNU_Privacy_Guard" class="external">GPG</a>) – pak ověřuje, že soubor skutečně pochází od zdroje, který ho vyrobil. Třetím součástí je kontrola <strong>antivirovým systémem</strong> – už mockrát se stalo, že oficiálně distribuované soubory byly napadeny a obsahovaly např. viry.
    </p>
    <note>
        <sup>*</sup> Je jasné, že když hromadu dat reprezentujete jedním výrazně kratším číslem, absolutní jistotu nemáte nikdy, ale pořád lepší než nic.
    </note>
    <p>
        PS: Pokud si někdo dá opravdu záležet a provede velmi sofistikovaný útok například na úrovni <a href="/materialy/net/overview.xml?slajd=4">DNS</a>, můžete stáhnout soubor, který projde všemi třemi kontrolami, ale přitom nebude pocházet ze správného místa, ačkoli si to budete myslet. Pak máte ovšem smůlu. Ostatně stejně jako s distribucí <em>veřejných klíčů</em> pro GPG – pokud vám daný klíč osobně nepředal člověk, kterému patří, také tu jistotu nikdy nebudete mít úplnou.
    </p>

</slide>
<slide title="Python III – instalace na Windows (1)">
    
    <p>
        Na první instalační obrazovce, než kliknete na výběr <em>Customize installation</em>, odškrtněte instalaci pro všechny uživatele (vyžaduje práva administrátora) a naopak zaškrtněte přidání Pythonu do tzv. <strong>cesty</strong> (díky čemuž operační systém bude vědět, kde ho má hledat):
    </p>
    <img src="_files/install/Python-1.png" width="800" alt="Python, instalace 1"/>
    
</slide>
<slide title="Python III – instalace na Windows (2)">
    
    <p>
        Druhou instalační obrazovku zaškrtejte podle obrázku:
    </p>
    <img src="_files/install/Python-2.png" width="800" alt="Python, instalace 2"/>
    <note>
        PS: Vážní zájemci si nainstalují i <em>Python test suite</em> – obsahuje mnoho poučného kódu. (A některá chování Python'u bez něj občas ani nedávají smysl.)
    </note>
    
</slide>
<slide title="Python III – instalace na Windows (3)">
    
    <p>
        A třetí taktéž. Můžete zde také upravit cestu k programu na něco rozumnějšího, než je výchozí výběr:
    </p>
    <img src="_files/install/Python-3.png" width="800" alt="Python, instalace 3"/>
    
</slide>
<slide title="Python IV">
    
    <p>
        Předchozí slajdy popisují nejjednodušší případ <strong>pouze jednoho interpretru Pythonu v počítači</strong>. Na naše hraní tak akorát. Kdo to ale bude myslet s Pythonem vážně, brzo mu to asi stačit nebude.
    </p>
    <note>
        Já mám kupříkladu v počítači Pythonů asi osm ve dvou operačních systémech najednou.
    </note>
    <p>
        Přitom <em>hlavní Python</em> může být jenom jeden, takže vícero Pythonů už se musí řešit složitěji (často i tak, že <strong>hlavní není žádný z nich</strong>). A protože Python se málokdy používá jen tak sám o sobě, přidává se k tomu i problém řešení závislostí všech dalších programů.
    </p>
    <p>
        PS: Oblíbeným řešením tohoto problému býval kupříkladu systém <a href="/materialy/python/packages/conda_overview.xml">Conda</a>, ale po změně pravidel užívání a zpoplatnění výchozího repozitáře balíčků je už lepší použít <a href="">něco jiného</a>.
    </p>
    
</slide>
<slide title="Python V">
    
    <p>
        Typický pythoní program se spouští tak, že se na soubor s programem pustí pythoní interpretr. Při nastavení z ukázkové instalace by na příkazové řádce v konzoli mělo stačit soubor tak zvaně „odentrovat“..
    </p>
    <example lang="cmd">
        > program.py↵
    </example>
    <p>
        ..protože operační systém ví, jak se k souborům s příponou <em>*.py</em> chovat.
    </p>
    <note>
        Nezabere-li to, bude třeba provést volání v podobě..
        <example lang="cmd">
            > python program.py↵
        </example>
        ..případně i s plnou cestou k pythonímu interpretru.
    </note>
    <p>
        Pro podrobnosti se můžete podívat do <a href="/materialy/cmd/cmd.xml">přednášky o příkazové řádce ve Windows</a>. Kdo bude pracovat v Linuxu, pravděpodobně se bez <a href="/materialy/cmd/bash.xml">příkazové řádky</a> už stejně dávno neobešel.
    </p>
    
</slide>
<slide title="Python interaktivně – REPL">
    
    <p>
        Kromě spouštění skriptů v Pythonu, což budeme potřebovat postupem času víc a víc, se dá interpretr pustit také <em>interaktivně</em> – příkazová řádka konzole je v tom případě nahrazena příkazovou řádkou interpretru a všechno funguje jinak:
    </p>
    <img src="_files/install/REPL.png" width="800" alt="Python REPL" />
    <p>
        Ovšem tento tzv. <a href="https://en.wikipedia.org/wiki/Read%E2%80%93eval%E2%80%93print_loop" class="external"><em>REPL</em></a> (<em>read–eval–print loop</em>) je zrovna v případě Pythonu hodně nepohodlný – Python totiž používá pro zápis kódu odsazené bloky textu a to se tedy zapisuje s jednořádkovou historií konzole velmi, velmi špatně.
    </p>
    <note>
        Kdo by to byl řekl – po bratru třiceti letech se REPL od verze 3.13 stal konečně použitelným…
    </note>
    
</slide>
<slide title="Python interaktivně – Dreampie aspol.">
    
    <p>
        Existuje mnoho nadstaveb nad touto jednoduchou příkazovou řádkou, které uvedený problém nějak řeší (jedna z nich – <em>IDLE</em> – je dokonce v základní instalaci Pythonu), ale já mám nejradši <a href="http://dreampie.org" class="external"><em>Dreampie</em></a>, který má historii víceřádkovou a navíc obsahuje nápovědu a jiné vymoženosti:
    </p>
    <img src="_files/install/DreamPie-1.png" width="800" alt="Dreampie REPL" />
    <note>
        <strong>A kromě toho samozřejmě jako všechny ostatní nadstavby nad základním konzolovým módem interpretru se chová v některých situacích jinak (a někdy i úplně špatně).</strong>
    </note>
    
</slide>
<slide title="Dreampie – instalace">
    
    <p>
        PS pro studenty: <strong><em>Dreampie</em> si NEinstalujte.</strong> Na ukázky a procvičování kódu je sice pořád nejlepší, ale už pěknou řádku let je nepodporovaný a nainstalovat ho je čím dál tím těžší.
    </p>
    <hr/>
    <p>
        Na Windows jednoduše stáhněte a pusťte <a href="https://github.com/downloads/noamraph/dreampie/dreampie-1.2.1-setup.exe" class="external">instalační balíček</a>.
    </p>
    <note>
        Nalinkována verze 1.2.1.
    </note>
    <p>
        Pokud máte v systému pouze jeden Python, pravděpodobně to pozná a nastaví se na jeho používání. Pokud ne, můžete zkusit položku <em>„Add Interpretr“</em> z nabídky <em>Start</em> Windows (která ale u mě kdo ví proč chce administrátorská práva).
    </p>
    <p>
        Pokud všechno selže, musíte si na něj (respektive na soubor <code>dreampie.exe</code>) vyrobit vlastní zkratku (soubor <em>*.lnk</em>) a v jejích <em>„Vlastnostech“</em> (typicky přes pravé tlačítko myši, pokud nejste leváci) nastavit <em>„Target“</em> nějak jako u mě:
    </p>
    <blockquote>
        <code>"C:\Program Files (x86)\DreamPie\dreampie.exe" --hide-console-window "C:\Users\znamenaj\Python38\python.exe"</code>
    </blockquote>
    <img src="_files/install/DreamPie-2.png" width="568" alt="Dreampie lnk" />
    
</slide>
<slide title="PS: Dreampie a Python 3.10+">
    
    <p>
        Kdo zkusil pustit Dreampie s Pythonem 3.10 (a novějším), zjistil, že to nejde. Dreampie je totiž již velmi starý a postavený na grafickém frejmworku, který nebyl (a nebude) pro trojkový Python nikdy naportován, a tak mimo jiné obsahuje kusy kódu, které prostě postupně přestávají fungovat.
    </p>

    <p class="enumerate">
        Prvním z takových kousků je přesunutí objektu <em>Callable</em> do jmenného prostoru <em>collections.abc.Callable</em>. Oprava je naštěstí jednoduchá – stačí v souboru <em>Dreampie/data/subp-py3/dreampielib/subprocess/__init__.py</em> přepsat řádku 843 na následující tvar:
    </p>
    <example lang="python">
        r = (isinstance(obj, collections.abc.Callable)
    </example>
    <note>
        Nebo samozřejmě <code>r = (callable(obj)</code> .
    </note>

    <p class="enumerate">
        Python 3.12 vyřadil knihovnu <em>imp</em>, takže další oprava se týká souboru <em>Dreampie/data/subp-py3/dreampielib/subprocess/find_modules.py</em>. Na řádce 25 je třeba zaměnit její import za novější..
    </p>
    <example lang="python">
        from importlib.machinery import SOURCE_SUFFIXES, BYTECODE_SUFFIXES, EXTENSION_SUFFIXES
    </example>
    <p>
        ..a následně pak přepsat logiku získávání přípon na řádce 33:
    </p>
    <example lang="python">
        r'(?:%s)$' % '|'.join(re.escape(suffix) for suffix in (SOURCE_SUFFIXES + BYTECODE_SUFFIXES + EXTENSION_SUFFIXES)))
    </example>

    <hr/>
    
    <p>
        Jak dlouho ale ještě půjde Dreampie takovýmto způsobem opravovat<sup>*</sup>, toť otázka. Nu a jakým jiným pěkným REPL-IDEčkem ho nahradit, toť ještě větší…
    </p>
    <note>
        <sup>*</sup> A to vlastně ještě jenom pod Windows, kde má Dreampie příslušnou GUI-knihovnu GTK (starou a na Python'u 2 postavenou) přibalenou u sebe, takže to vůbec opravit jde. <!--Dostat něco takového na moderní linuxové distribuci do nepodporovaného dvojkového Pythonu už je prakticky nemožné. A běžet kvůli jednomu programu virtuálku se starým operačním systémem…-->
    </note>

</slide>
<slide title="Psaní větších programů">
    
    <p>
        <em>Dreampie</em> je fajn na hraní a zkoušení kratších kousků kódu (historie zadávacího okénka se vyvolává pomocí <code>CTRL+↑</code>), ale kromě toho, že v něm některé věci prostě nefungují (jako například nápověda <code>help()</code> nebo část formátování pro funkci <code>print()</code>), na psaní programů opravdu není.
    </p>
    <note>
        I když už to pár lidí poměrně úspěšně také zkoušelo ^_^"
    </note>
    <p>
        Větší programy se nejlépe píší v nějakém editoru (sadomasochisti to dávají i v <em>Poznámkovém bloku</em>), ideálně nějakém určeném pro programátory, který přinejmenším obsahuje <strong>zvýrazňování syntaxe</strong> příslušného jazyka, často i něco navíc.
    </p>
    <p>
        PS: Velmi důležité také je, aby editor uměl ukázat tzv. <strong>bílé znaky</strong> (mezery, tabulátory, odřádkování…), protože pro Python jsou životně důležité, <strong>typ kódování souboru</strong>, který sice nemusí být zrovna UTF-8, ale <a href="/materialy/python/pitfalls.xml?slajd=6">pak se musí do hlavičky pythoního programu toto jiné kódování explicitně zapsat</a>, a časem také <strong>typ konce řádky</strong> (protože se mezi operačními systémy liší).
    </p>
    
</slide>
<slide title="Některé vhodné textové editory">
    
    <p>
        Textový editor je velmi silně ovlivněn osobními preferencemi – většina studentů programování na ČVUTu odmítá pracovat jinde než v dedikovaném pythoním IDE, jiní na druhou stranu zvládají editor <em>Vim</em> v příkazové řádce linuxové konzole. Následují odkazy na několik prověřených (a většinou i sympaticky malých) editorů..
    </p>
    <ul>
        <li>
            <a href="http://www.flos-freeware.ch/notepad2.html" class="external"><em>Notepad2</em></a>
        </li>
        <li>
            <a href="https://notepad-plus-plus.org" class="external"><em>Notepad++</em></a>
        </li>
        <li>
            <a href="http://www.pspad.com/cz/" class="external"><em>PSPad</em></a> (český program)
        </li>
        <li>
            <a href="https://sublimetext.com" class="external"><em>Sublime Text</em></a> (placený, ale na zkoušku možno používat zdarma)
        </li>
        <li>
            <a href="https://coteditor.com" class="external"><em>CotEditor</em></a> (pro MacOS)
        </li>
    </ul>
    <p>
        ..plus několik plnohodnotných pythoních IDE:
    </p>
    <ul>
        <li>
            <a href="https://thonny.org" class="external"><em>Thonny</em></a> (navzdory určení pro začátečníky obsahuje velmi pokročilé věci)
        </li>
        <li>
            <a href="https://github.com/pyscripter/pyscripter" class="external"><em>Pyscripter</em></a>
        </li>
        <li>
            <a href="http://www.jetbrains.com/pycharm/" class="external"><em>PyCharm</em></a> (volná i placená verze)
        </li>
    </ul>
    <p>
        Žádný konkrétní vám nutit nemůžu, ale nějaký, který osobně vám bude vyhovovat, si časem budete muset vybrat.
    </p>
    
</slide>
<slide title="Poznámka k použití „Jupyter Notebook“">

    <p>
        Dnes už asi prakticky každý, kdo slyšel o použití programovacího jazyka Python nejen ve vědě, zakopl o <a href="https://jupyter.org" class="external"><strong>Jupyter Notebook</strong></a>. A studenti tak mají tendenci ho používat na psaní programů. A vůbec to není dobrý nápad :-)
    </p>
    <p>
        Abychom si rozuměli – <em>Jupyter</em> je bezvadný nástroj, ale především na to, na co byl určen. A to je záznam komplexního výpočtu a/nebo práce nad nějakými daty. Pro psaní testovacích výukových programů (nebo nedejbože zkouškových) se ale vůbec nehodí. Ne že by to nešlo, když se budete hodně moc krotit a hlídat, ale nestojí to za to. (Kdyby už jen kvůli tomu, že buňky s kódem se nemusí vyhodnotit v zapsaném pořadí a musíte na to myslet.)
    </p>
    <p>
        Zkrátka a dobře – <em>Jupyter</em> se naučte, bude se vám hodit (a stoupne vaše cena na trhu práce), ale pro výuku Python'u (zvlášť u úplných začátečníků) na něj radši (dočasně) zapomeňte.
    </p>
    
</slide>
<slide title="Na závěr">
    
    <p>
        Kromě vhodné distribuce Pythonu a vyhovujícího programátorského editoru se každý, kdo to bude myslet s Pythonem ve vědě vážně, bude muset časem pořádně naučit <a href="/materialy/cmd/bash.xml">příkazovou řádku v Linuxu</a>. A to prostě proto, že sice dnes už dávno máme každý svůj počítač, ale výpočty se staly tak náročnými, že – už zase! – musí běžet na nějakých vzdálených strojích, které je „utáhnou“. A tyto stroje jsou prakticky naprosto univerzálně postavené na operačním systému Linux a přistupuje se k nim pomocí protokolu SSH v příkazové řádce.
    </p>
    <p>
        Ale to je jenom upozornění do budoucna, pokud budete ve vědě programovat ^_~ Také vám nebude zdaleka stačit jenom Python (i když je dnes opravdu skoro všude a na hodně věcí je i přes své mouchy víc než vyhovující).
    </p>
    
</slide>


</lecture>
