<?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>Modul „venv“</title>
  <date>2014-11-10</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>
        Tato přednáška pojednává o použití modulu <strong><code>venv</code></strong> pro tvorbu a správu <em>virtuálních prostředí</em> od Python'u 3.3 výše.
    </p>
    <p>
        Pro obecný úvod do <em>virtuálních prostředí</em> a jejich technické realizace si prostudejte nejdříve <a href="virtual_overview.xml">příslušnou přednášku</a>.
    </p>

</slide>
<slide title="Zavedení nového virtuálního prostředí">

    <p>
        Od Python'u verze 3.8 se <em>virtuální prostředí</em> zavádí již jen jediným způsobem přímo pomocí odpovídajícího modulu <em>venv</em>:
    </p>
    <example lang="python">
        python -m venv /cesta/k/novému/virtuálnímu/prostředí
    </example>
    <p>
        Uvedený příkaz vyrobí cílový adresář a v něm:
    </p>
    <ul>
        <li>
            konfigurační soubor <em>pyvenv.cfg</em> s klíčem <em>home</em> ukazujícím na příslušnou pythoní binárku (a s případnými dalšími klíči podle konkrétní podoby zavolání), kterou zasymlinkuje/zkopíruje do podadresáře <em>bin</em> (<em>Scripts</em> pod Windows);
        </li>
        <li>
            podadresář <em>lib/pythonX.Y/site-packages</em> (<em>Lib\site-packages</em> pod Windows);
        </li>
        <li>
            prázdný podadresář <em>Include</em>;
        </li>
        <li>
            od verze Python'u 3.13 též soubor <a href="/materialy/dvcs/git.xml?slajd=5"><em>.gitignore</em></a>, který vyjme adresář virtuálního prostředí z verzování <em>gitu</em>.
        </li>
    </ul>

</slide>
<slide title="Další možnosti nastavení">

    <p>
        Vytvoření virtuálního prostředí je možné ovlivnit několika přepínači:
    </p>
    <ul>
        <li>
            <code>--system-site-packages</code> – knihovny z globálního adresáře <em>site-packages</em> budou přístupné (ale místní stejného jména budou pořád mít prioritu);
            <note>
                Tato volba se projeví nastavením klíče <em>include-system-site-packages</em> v konfiguračním souboru virtuálního prostředí <em>pyvenv.cfg</em> na hodnotu <code>True</code>.
            </note>
        </li>
        <li>
            <code>--symlinks</code> – pokusí se přednostně odkazy na potřebné soubory vyrobit jako symbolické odkazy;
            <note>
                Na Windows je sice možné simlinky také vytvořit, ale není to dobrý nápad, protože např. dvojtý klik na <em>python.exe</em> v <em>Prohlížeči</em> je bude ve výsledku ignorovat.
            </note>
        </li>
        <li>
            <code>--copies</code> – pokusí se přednostně odkazy na potřebné soubory vyrobit jako kopie (od Python'u 3.4);
        </li>
        <li>
            <code>--clear</code> – již existující adresář virtuálního prostředí stejného jména nejdříve smaže;
        </li>
        <li>
            <code>--upgrade</code> – povýší virtuální prostředí na novou verzi Python'u;
        </li>
        <li>
            <code>--without-pip</code> – do virtuálního prostředí nebude nainstalován <a href="/materialy/python/packages/pip.xml"><code>pip</code></a> (který tam totiž jinak od Python'u 3.4 je ve výchozím nastavení přítomen);
        </li>
        <li>
            <code>--prompt VÝZVA</code> – alternativní prefix virtuálního prostředí na příkazové řádce (jinak se použije jméno vytvářeného adresáře);
        </li>
        <li>
            <code>--upgrade-deps</code> – v podstatě v rámci instalace povýší nainstalovaný <em>pip</em> rovnou na nejnovější verzi;
        </li>
        <li>
            <code>--without-scm-ignore-files</code> – nevyrobí konfigurační soubor pro ignorované soubory v rámci <a href="/materialy/dvcs/overview.xml">DVCS</a> (toho času tedy jenom <em>.gitignore</em>).
        </li>
    </ul>
    <p>
        PS: Modulu <em>venv</em> je srdečně jedno, v jakém pořadí zapíšete parametry a cestu k virtuálnímu prostředí.
    </p>

</slide>
<slide title="Práce s virtuálním prostředím">

    <p class="enumerate">
        Budete-li inteprepret Python'u a jiné programy/skripty z virtuálního prostředí spouštět pouze pomocí zde umístěných odkazů/souborů (tedy s uvedením cesty k nim), nemusíte nic jiného dělat – jak vámi napsané pythoní skripty, tak třeba i instalace balíčků do místního <em>site-packages</em> budou probíhat pouze zde.
    </p>
    
    <p class="enumerate">
        Nechcete-li však myslet na cesty ke spustitelným souborům, můžete dané virtuální prostředí tzv. <strong>aktivovat</strong>, čímž vlastně jen přidáte odkaz na podadresář <em>bin</em> (<em>Scripts</em> pod Windows) daného virtuálního prostředí na začátek <em>cesty</em>. (Až ho nebudete potřebovat, nezapomeňte ho zase <em>deaktivovat</em>!)
    </p>
    <p>
        (De)aktivace se provádí pomocí skriptu <code>activate/deactivate</code>, jehož umístění i celý název je platformně závislé. Dvě nejčastější varianty (z pěti podporovaných):
    </p>
    <example lang="bash">
        # Linux s bashem
        $ source &lt;venv>/bin/activate
        
        # Windows s cmd
        C:> &lt;venv>/Scripts/activate.bat
    </example>
    <notes>
        <note>
            <em>&lt;venv></em> zde zastupuje adresář, v němž je „nainstalováno“ příslušné virtuální prostředí.
        </note>
        <note>
            Aktivace je platná pouze pro aktuální <em>shell</em> (konzoli), takže deaktivaci můžete provést také jeho pouhým zavřením.
        </note>
        <note>
            Pro aktivaci v <em>PowerShell</em>u pravděpodobně budete muset aktivovat oprávnění <code>PS C:\> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser</code> .
        </note>
    </notes>

</slide>
<slide title="Preferovaný způsob práce">

    <p>
        Z praktických důvodů je doporučováno zavést virtuální prostředí přímo v adresáři projektu, kde ho potřebujete. A aby se tam nepletlo, doporučovaný název je pak <strong><code>.venv</code></strong>, tedy s tečkou na začátku.
    </p>
    <note>
        Tím ho i vizuálně dostáváte na úroveň adresářů typu <code>.git</code> a jiných konfiguračních.
    </note>
    <p>
        <strong>Virtuální prostředí by nemělo být součástí verzování projektu</strong>, pouze soubor pro jeho snadné znovuvytvoření v případě potřeby (viz <a href="pip.xml?slajd=6"><code>requirements.txt</code></a>). Proto je také ve výchozím nastavení automaticky vyroben odpovídající <code>.gitignore</code>.
    </p>
    <note>
        Což je pochopitelné, když si uvědomíte, jak obrovské mohou být knihovny požadované projektem. Třeba takový <a href="/materialy/jupyter/overview.xml">JupyterLab</a> to hravě dotáhne na stovku závislostí a několik set megabajtů zabraného místa.
    </note>

</slide>
<slide title="Kontrola, kde vlastně jsme">

    <p>
        Při práci s více prostředími zase není až takový problém se ztratit. Naštěstí pro nás obsahuje modul <em>sys</em> několik atributů hlásících adresář umístění aktuálně spuštěného Python'u, které nám pomohou:
    </p>
    <ul>
        <li>
            <code>sys.base_prefix</code> – adresář instalace, nemění se ve virtuálním prostředí;
        </li>
        <li>
            <code>sys.prefix</code> – adresář aktuálně spuštěné binárky, mění se podle virtuálního prostředí.
        </li>
    </ul>
    <p>
        Tudíž se často stačí podívat do atributu <code>sys.prefix</code>, abychom se zorientovali.
    </p>
    <note>
        Naneštěstí je atribut <code>sys.prefix</code> přenastaven na odpovídající aktuální hodnotu modulem <code>site</code>, takže podaří-li se vám pustit Python bez něj (což je sice velmi neobvyklé, ale jde to), máte stejně smůlu.
    </note>

</slide>
<slide title="Deaktivace a zrušení virtuálního prostředí">

    <p>
        Virtuální prostředí se zruší prostým smazáním příslušného adresáře. (Takže v případě doporučeného použití „virtuální prostředí jako podadresář <code>.venv</code> projektu“ prostě smažete odpovídající adresář <code>.venv</code>.)
    </p>
    <p>
        V rámci daného otevřeného <em>shell</em>u (pracovní konzole) ovšem zůstává aktivováno, proto ho nezapomeňte deaktivovat, jinak vám zůstanou v proměnných prostředí viset neplatné hodnoty! Nebo příslušný <em>shell</em> zavřete a otevřete si nový, tím se deaktivace provede automaticky.
    </p>
    <note>
        Totéž se týká přechodu práce na jiný projekt v jiném virtuálním prostředí – ve stejném <em>shell</em>u nejdříve deaktivujte prostředí aktuální a následně aktivujte nové anebo daný <em>shell</em> zavřete a otevřete si nový, v němž aktivujete nové virtuální prostředí.
    </note>

</slide>


</lecture>
