<?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>Vícero Python'ů na jednom systému</title>
  <date>2016-05-31</date>
  <link><!--a href="http://vyuka.ookami.cz" rel="external">http://vyuka.ookami.cz</a--></link>
</meta>
<!--
  „“–…
  ←→ ↑↓ ↔↕
  ↵ aneb &#x21B5; aneb \r aneb CR aneb CarriageReturn
-->


<slide title="Úvod">

    <p>
        Vzhledem k dichotomii mezi trojkovou a dvojkovou řadou Python'u se vám velmi pravděpodobně stane, že budete:
    </p>
    <ul>
        <li>
            pracovat na systému, kde je nainstalováno více různých verzí Python'u;
        </li>
        <li>
            používat pro různé (nebo dokonce i stejné) projekty různé verze Python'u.
        </li>
    </ul>
    <p>
        Proto je velmi důležité vědět, jak volat/použít právě ten Python, který zrovna potřebujete.
    </p>

</slide>
<slide title="Linux – „python“">

    <p>
        Na Linuxu je to většinou docela jednoduché<sup>*</sup> – každá verze Python'u má přiřazenu svoji vlastní pojmenovanou binárku. Největší zádrhel se schovává většinou jenom v tom, která z verzí je základní, tedy který Python se zavolá na příkaz <code>python</code>.
    </p>
    <note>
        <sup>*</sup> Pomíjím teď zcela fakt, že Linux měl pro systémový Python použít nějaký úplně jiný název (třebas <em>python-system</em> nebo tak něco) a byli bychom všech dnešních problémů ušetřeni. Mimochodem – Python nainstalovaný na Windows se vůbec jako systémový hlásit nemusí.
    </note>
    <p>
        Jsou distribuce (např. <em>Arch Linux</em>), které už leta letoucí jako základní poskytují zásadně Python trojkový, takže na příkaz <code>python</code> se zavolá právě on. Většina distribucí však stále-pořád-ještě jako základní má Python dvojkový, takže trojkový se musí volat <code>python3</code> (a často ještě nejdřív i doinstalovat).
    </p>

</slide>
<slide title="Linux – „#!“">

    <p>
        Uděláte-li pythoní skript spustitelným a vybavíte-li ho příslušnou hlavičkou (tzv. <em>shebang</em>em), použije se na jeho spuštění verze Python'u zde uvedená.
    </p>
    <p>
        Platí ovšem úplně stejné omezení jako v <a href="?slajd=2">předchozím případě</a> – neurčíte-li verzi přesně pomocí čísla, tedy použijete pouze obyčejné <code>python</code>, zavolá se příslušná systémová.
    </p>
    <note>
        Nejhorší je to při přenášení skriptů mezi systémy – zatímco u vás může <code>python</code> volat poslední trojkovou binárku, u někoho jiného jako na potvoru spustí dvojkovou, na to vemte jed…
    </note>

</slide>
<slide title="Windows – „#!“">

    <p>
        Celkem šikovné chování <em>shebang</em>u z Linuxu kopírují windowsí instalace Python'u 3.3+ – s nimi se totiž do systému přidá spouštěč Python'u v podobě programu <em>py.exe</em>, který slouží k dohledání a zavolání nejvhodnější verze Python'u pro daný skript.
    </p>
    <p>
        Číslo verze můžete předat na příkazové řádce (např. <code>py -2.6 skript.py</code> apod.) nebo právě v <em>shebang</em>ové hlavičce skriptu. Nicméně rozeznávané hlavičky (nepočítáme-li čísla verzí Python'u) jsou jen a právě následující čtyři:
    </p>
    <ul>
        <li><code>#!/usr/bin/env python</code></li>
        <li><code>#!/usr/bin/python</code></li>
        <li><code>#!/usr/local/bin/python</code></li>
        <li><code>#! python</code></li>
    </ul>
    <note>
        A z praktických důvodů tam všude budete chtít psát <code>python3</code>.
    </note>

</slide>
<slide title="Windows – „python“">

    <p>
        S <a href="?slajd=4">předchozím</a> úzce souvisí chování skriptů, u nichž <em>shebang</em> není předepsán. Ve Windows jsou totiž všechny soubory jaksi automaticky spustitelné – když odentrujete/dvojkliknete (nejen) pythoní skript, pokusí se Windows najít program, který na něj zavolat. A zde nás čeká překvapení:
    </p>
    <blockquote>
        Máte-li nainstalovaný dohromady dvojkový i trojkový Python, tak i při vybrání trojkového jako výchozího se v tomto případě zavolá Python dvojkový!
    </blockquote>
    <note>
        Ale samozřejmě pouze v případě, že byl při instalaci vybrán jako systémový. V opačném případě Windows jednoduše nebudou vědět, čím mají uvedený soubor zpracovat.
    </note>
    <p>
        Uvedené chování bylo zřejmě (bohužel) vybráno s ohledem na běžné uživatele a rozšířenost dvojkových skriptů – když uživatel neví, co přesně chce, tak chce nejspíš dvojku… Naštěstí pro nás se to dá přepsat – stačí zavést proměnnou prostředí <code>PY_PYTHON</code> s hodnotou 3.
    </p>
    <note>
        Jen na to zase nezapomeňte, když budete skripty někomu předávat. Správně – a plně! – zapsaný <em>shebang</em> je nejjistější.
    </note>
    <p>
        PS: Vývoj se pomalu přeci jen děje – od verze Python'u 3.6 je uvedené chování již vypnuté (alespoň pro spouštěč <em>py.exe</em>; příkaz <code>python</code> stále zavolá dvojku, pokud je naistalována jako systémová). Ale pochopitelně ne všude budete mít k dispozici tuhle nebo novější, takže veškeré uvedené připomínky platí i nadále.
    </p>

</slide>
<slide title="Poznámky">

    <p>
        Mimochodem – máte-li například více dvojkových Python'ů, na příkaz <code>python2</code> se zavolá ten poslední. Což je bohudík aspoň celkem logické. Nicméně shrňme si to všechno dohromady:
    </p>
    <p>
        Máte-li nainstalovány například Python'y 3.4.4 a 2.7.11, pak při použití hlavičky <code>#!/usr/bin/env python</code> (důležitý je tady ten samotný <em>python</em> na konci) se stejně zavolá Python 2.7.11, i když byla verze 3.4.4 vybrána jako hlavní. Jelikož to téměř určitě není očekávané chování, napravit ho můžete několika způsoby:
    </p>
    <ol>
        <li>
            změňte hlavičku na <code>#!/usr/bin/env python3</code> ;
        </li>
        <li>
            nastavte proměnnou prostředí <code>PY_PYTHON</code> na hodnotu 3;
        </li>
        <li>
            volejte skript jako <code>py -3 skript.py</code> .
        </li>
    </ol>
    <p>
        Druhý bod je nejsnažší pro vlastní práci, první bod je nejlepší při přenášení skriptů mezi systémy.
    </p>
    <p>
        Třetí bod vypadá jako z nouze ctnost, ale jelikož zadání parametru spouštěče zvítězí nad případnou hlavičkou uvnitř skriptu, může se někdy také pěkně hodit.
    </p>

</slide>
<slide title="PS: Poznámka pro Mac">

    <p>
        Používáte-li nějaký přístroj s operačním systémem <em>MacOS</em>, sedíte v podstatě u nejpromyšlenějšího GUI pro unixový operační systém (<a href="https://en.wikipedia.org/wiki/MacOS_version_history" class="external">historie MacOS X sahá až k BSD</a>). Nicméně narozdíl od ostatních Unixů – a Linuxů – co <strike>Bůh</strike> Steve Jobs neschválil, to neučiníte.
    </p>
    <p>
        Podobně jako v Linuxech je v MacOS přítomen systémový Python (a to zhusta ve dvojkové verzi), na který ovšem narozdíl od Linuxů nemáte právo vůbec sahat. Což je mimochodem dobře. Chcete-li tudíž pod MacOS provozovat nějaký svůj jiný Python (či dokonce Pythony), nezbyde vám nic jiného, než na to krásné a promyšlené GUI zapomenout a naučit se používat příkazovou řádku – moc jiných možností, než nainstalovat balíčkovací systém <a href="https://brew.sh" class="external"><em>Homebrew</em></a> a s jeho pomocí pak Python, totiž nemáte.
    </p>
    <note>
        Nebo můžete rovnou nainstalovat <a href="/materialy/python/packages/conda_overview.xml">Condu</a>. Ale příkazové řádce stejně neutečete ^_~
    </note>
    <p>
        PS: Aby bylo jasno – pokud se nebojíte příkazové řádky (pod MacOS pravda trochu oxymoron), jste v mnohem lepší situaci než pod Linuxem, kde si můžete levou zadní rozvrtat systém, aniž byste o tom měli vůbec tušení. (Nehledě na to, že poslední inkarnace Linuxů s GUI padají snad víc, než kdy vůbec padaly Windows…)
    </p>
    <note>
        PPS: Pokud už máte od Applu notebook, pořiďte si od něj i všechno ostatní (mobil, televizi…) a zapomeňte, že existují i jiné systémy. Ušetříte si spoustu problémů.
    </note>

</slide>


</lecture>
