{"id":8594,"date":"2022-02-27T15:11:24","date_gmt":"2022-02-27T13:11:24","guid":{"rendered":"https:\/\/u-labs.de\/portal\/?p=8594"},"modified":"2023-05-16T22:44:08","modified_gmt":"2023-05-16T20:44:08","slug":"was-ist-eine-python-virtualenv-venv-und-wozu-braucht-man-sie-virtuelle-python-umgebung-fuer-einsteiger","status":"publish","type":"post","link":"https:\/\/u-labs.de\/portal\/was-ist-eine-python-virtualenv-venv-und-wozu-braucht-man-sie-virtuelle-python-umgebung-fuer-einsteiger\/","title":{"rendered":"Was ist eine Python virtualenv\/venv und wozu braucht man sie? Virtuelle Python Umgebung f\u00fcr Einsteiger"},"content":{"rendered":"<p>Wer damit anf\u00e4ngt mit der beliebten Sprache Python zu programmieren, wird fr\u00fcher oder sp\u00e4ter bei der Paketverwaltung <strong>Pip <\/strong>landen. Als Entwickler kann man seinen Code \u00fcber Pip anderen anbieten, die ihn mit einem Befehl installieren und in ihren eigenen Programmen nutzen k\u00f6nnen. Dank der Arbeit anderer kann man dadurch Funktionen einfacher und schneller einbauen. Man findet dort hunderttausende Pakete, von kleineren Helfern \u00fcber API-Schnittstellen bis hin zu m\u00e4chtigen Frameworks mit dutzenden Funktionen.<\/p>\n<p>Beispiel: F\u00fcr einen Slack-Bot gibt es das Paket <strong>slack_sdk<\/strong>, f\u00fcr einen Telegram-Bot <strong>pyTelegramBotAPI <\/strong>und so weiter. M\u00f6chtest du so ein Paket installieren, wird es standardm\u00e4\u00dfig im Home-Verzeichnis des angemeldeten Benutzers angelegt, bei der Nutzung als root (sudo) sogar global.<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">$ pip3 install slack_sdk\n\n$ pip3 list -v | grep slack\nslack-sdk          3.15.1    \/home\/pi\/.local\/lib\/python3.7\/site-packages pip<\/code><\/pre>\n<p><strong>HINWEIS<\/strong>: Pip ist standardm\u00e4\u00dfig nicht vorinstalliert und muss zun\u00e4chst h\u00e4ndisch installiert werden:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">sudo apt install python3-pip<\/code><\/pre>\n<p>Anfangs ist das kein Problem, sondern sogar effizient. Schlie\u00dflich wird ein Paket wie z.B. <strong>slack_sdk <\/strong>nur einmal installiert, egal ob man es in einem oder f\u00fcnf Projekten verwendet. Sp\u00e4testens wenn man mehr als ein Python-Projekt hat, kann es zu Konflikten kommen: In Projekt A wird z.B. das Paket <strong>slack_sdk <\/strong>in Version 3.0 verlangt, Projekt B nutzt das gleiche Paket in Version 3.15. Wir haben aber nur eine Version installiert: Entweder die neuere, womit Projekt A Probleme bekommen kann. Oder die \u00e4ltere, in der m\u00f6glicherweise neue Funktionen fehlen, die Projekt B ben\u00f6tigt.<\/p>\n<p>Dies ist ein grunds\u00e4tzliches Problem, egal ob wir ein Paket f\u00fcr Slack, Telegram oder etwas v\u00f6llig anderes installieren. Man bedenke, dass Pip mittlerweile hunderttausende Pakete umfasst. Zumal dieses Beispiel nur von direkten Konflikten ausgeht. Es kann auch zu indirekten Konflikten kommen, wenn zwei verschiedene Pakete wiederum beide von einem dritten Paket in unterschiedlichen Versionen abh\u00e4ngt.<\/p>\n<h2 class=\"wp-block-heading\">Die L\u00f6sung: Eine virtuelle Python-Umgebung<\/h2>\n<p>Das Problem sind also die globalen Pakete, die entweder f\u00fcr einen Benutzer oder sogar f\u00fcr das gesamte System installiert werden. Hier kommt das Werkzeug Virtualenv ins Spiel: Es erzeugt eine virtuelle Umgebung pro Projekt, in das die Pakete installiert werden &#8211; statt global. Dadurch k\u00f6nnen sich Abh\u00e4ngigkeiten verschiedener Projekte nicht mehr in die Quere kommen.<\/p>\n<p>Es gibt zwei Arten von virtuellen Umgebungen: <strong>venv<\/strong> ist in Python3 integriert, enth\u00e4lt aber nur einen Teil der Funktionen und ist langsamer. Ich w\u00fcrde daher <strong>virtualenv<\/strong> verwenden, dies m\u00fcssen wir zun\u00e4chst installieren:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">sudo apt install python3-virtualenv\n# Manjaro\npamac install python-virtualenv<\/code><\/pre>\n<p>Legen wir nun eine erste beispielhafte virtuelle Umgebung f\u00fcr ein Projekt im Home-Verzeichnis an. Sie muss anschlie\u00dfend aktiviert werden:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\"># Alternativ: python3 -m virtualenv\n$ virtualenv .\/hello_world_virtualenv\ncreated virtual environment CPython3.9.2.final.0-64 in 474ms\n  creator CPython3Posix(dest=\/home\/pi\/hello_world_virtualenv, clear=False, no_vcs_ignore=False, global=False)\n  seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=\/home\/pi\/.local\/share\/virtualenv)\n    added seed packages: pip==20.3.4, pkg_resources==0.0.0, setuptools==44.1.1, wheel==0.34.2\n  activators BashActivator,CShellActivator,FishActivator,PowerShellActivator,PythonActivator,XonshActivator\n\npi@pi:~ $ source .\/hello_world_virtualenv\/bin\/activate\n(hello_world_virtualenv) pi@pi:~ $\n<\/code><\/pre>\n<p>Der Name der Umgebung erscheint dadurch links im Promt. So seht ihr sofort, dass ihr euch in einer virtuellen Umgebung befindet und in welcher. Die installierten Pakete lassen sich mit pip3 list anzeigen:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">(hello_world_virtualenv) pi@pi:~ $ pip3 list\nPackage       Version\n------------- -------\npip           20.3.4\npkg-resources 0.0.0\nsetuptools    44.1.1\nwheel         0.34.2<\/code><\/pre>\n<p>Das sind Standardpakete von Python. Nun k\u00f6nnen wir testweise ein eigenes Paket installieren, z.B. pyTelegramBotAPI:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">(hello_world_virtualenv) pi@pi:~ $ pip3 install pyTelegramBotAPI\nLooking in indexes: https:\/\/pypi.org\/simple, https:\/\/www.piwheels.org\/simple\nCollecting pyTelegramBotAPI\n  [...]\n(hello_world_virtualenv) pi@pi:~ $ pip3 list\nPackage            Version\n------------------ ---------\ncertifi            2021.10.8\ncharset-normalizer 2.0.12\nidna               3.3\npip                20.3.4\npkg-resources      0.0.0\npyTelegramBotAPI   4.4.0\nrequests           2.27.1\nsetuptools         44.1.1\nurllib3            1.26.8\nwheel              0.34.2<\/code><\/pre>\n<p>Anschlie\u00dfend taucht es in der Liste auf. Die anderen neu dazugekommenen Pakete stammen von Abh\u00e4ngigkeiten. Beispielsweise nutzt das Telegram-Paket wiederum das Paket <strong>requests<\/strong>, um HTTP-Anfragen durchzuf\u00fchren. Um zu best\u00e4tigen, dass diese Pakete nur in unserer virtuellen Umgebung installiert sind, verlassen wir sie einfach einmal. Dazu einfach den Befehl <strong>deactivate<\/strong> eingeben und der Umgebungsname am Anfang verschwindet:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">(hello_world_virtualenv) pi@pi:~ $ deactivate\npi@pi:~ $ pip3 list\nPackage            Version\n------------------ ---------\nappdirs            1.4.4\ncertifi            2020.6.20\nchardet            4.0.0\ncolorzero          1.1\ndistlib            0.3.1\ndistro             1.5.0\nfilelock           3.0.12\ngpiozero           1.6.2\nidna               2.10\nimportlib-metadata 1.6.0\nmore-itertools     4.2.0\npip                20.3.4\npython-apt         2.2.1\nrequests           2.25.1\nRPi.GPIO           0.7.0\nsetuptools         52.0.0\nsix                1.16.0\nspidev             3.5\nssh-import-id      5.10\nurllib3            1.26.5\nvirtualenv         20.4.0+ds\nwheel              0.34.2\nzipp               1.0.0<\/code><\/pre>\n<p>Hier sind auf dem Raspberry Pi standardm\u00e4\u00dfig ein paar Pakete installiert, dies hat aber nichts mit unserer virtuellen Umgebung zutun. Das soeben installierte Telegram-Paket. Erst wenn wir zur\u00fcck in die zuvor erstellte virtuelle Umgebung wechseln, taucht es dort auf:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">pi@pi:~ $ pip3 list | grep -i telegram\npi@pi:~ $\n\npi@pi:~ $ source .\/hello_world_virtualenv\/bin\/activate\n(hello_world_virtualenv) pi@pi:~ $ pip3 list | grep -i telegram\npyTelegramBotAPI   4.4.0\n(hello_world_virtualenv) pi@pi:~ $<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Wer damit anf\u00e4ngt mit der beliebten Sprache Python zu programmieren, wird fr\u00fcher oder sp\u00e4ter bei der Paketverwaltung Pip landen. Als Entwickler kann man seinen Code \u00fcber Pip anderen anbieten, die ihn mit einem Befehl installieren und in ihren eigenen Programmen nutzen k\u00f6nnen. Dank der Arbeit anderer kann man dadurch Funktionen einfacher und schneller einbauen. Man &#8230;<\/p>\n","protected":false},"author":5,"featured_media":8605,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[61],"tags":[1026,1025],"class_list":["post-8594","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-softwareentwicklung","tag-pip","tag-python"],"_links":{"self":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/8594","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/comments?post=8594"}],"version-history":[{"count":7,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/8594\/revisions"}],"predecessor-version":[{"id":10566,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/8594\/revisions\/10566"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/media\/8605"}],"wp:attachment":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/media?parent=8594"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/categories?post=8594"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/tags?post=8594"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}