~~REVEAL~~
====== Python Virtual Environment ======
Les eines de //virtual environment// per a Python es fan servir per a aïllar cada aplicació (i les seves llibreries i dependències) del sistema operatiu i de les altres aplicacions.
{{ python-virtualenv-project-structure.jpg?direct&400 }}
==== Altres articles sobre Python en aquest web ====
{{topic>python}}
\\
===== Python virtualenv =====
* Desenvolupar o posar en producció **aplicacions en Python requereix diferents llibreries per cada projecte**.
* Les llibreries es solen instal·lar amb el **gestor de paquets ''pip''**.
* Es desaconsella instal·lar llibreries al propi sistema operatiu, pot interferir en el seu funcionament
* Diverses apps o el SO poden requerir diferents versions de Python o de les llibreries.
* PROHIBIT sudo pip install ...
* Les eines de //virtual environment// creen **entorns aïllats** del propi SO i així no s'interfereixen.
\\
===== Opcions de Virtual Environment =====
Els //virtual environments// es poden instal·lar al menys de 2 maneres:
* **''venv''** : Des de Python 3.3 es pot amb l'eina que porta ja el propi intèrpret.
* **''virtualenv''** : es pot instal·lar el paquet ''virtualenv'' amb el gestor PIP.
\\
===== Requeriments per a Virtualenv =====
* Comprova la versió que tens de Python:$ python --version
* En els exemples utilitzarem Python 3. Si no està instal·lat, ho pots fer amb:$ sudo apt install python3
* Instal·la el mòdul ''venv'':$ sudo pip install python3-venv
\\
===== Built-in venv =====
Ve [[https://docs.python.org/es/3/library/venv.html|incorporat a l'intèrpret des de Python v3.3]]. És la forma recomanada, tot i que sovint cal instal·lar una dependència que no venia amb Python:
$ sudo apt install python3-venv
Per crear el ''virtual environment'' fem:
$ python -m venv
Típicament
$ python -m venv env
Veurem que s'ha creat una carepta ''env'' on hi ha els binaris de Python i el gestor de paquets ''pip''.
\\
===== Virtualenv =====
Si has creat el teu ''env'' amb el //built-in venv// de Python, no cal que segueixis aquesta secció (virtualenv és una forma alternativa de fer el que Python-venv ja ens ha fet). Pots anar directament a la secció "Utilitzant Virtualenv".
Abans de la versió 3.3 de Python es feia servir la [[https://virtualenv.pypa.io/en/latest/installation.html|utilitat virtualenv]]. Si treballem en Pyhton 2.x o <3.3 només tindrem disponible aquesta opció.
* Necessitem ''**pip3**'', el gestor de paquets per a Python més conegut. En Debian/Ubuntu l'instal·lem amb:$ sudo apt install python3-pip
* Ara podrem instal·lar el paquet ''**virtualenv**'':$ sudo pip3 install virtualenv
* Podem comprovar les llibreries instal·lades en el sistema operatiu fent$ pip3 freeze
* Podem crear ara, un entorn de test:$ virtualenv envtest
Això ens crearà una carpeta ''envtest'' amb l'intèrpret de Python pertinent i on s'emmagatzemaran les llibreries que instal·lem amb ''pip''.
===== Utilitzant sudo =====
Aquestes ordres d'instal·lació del ''virtualenv'' (el paquet de PyPI instal·lat amb ''pip'') són les úniques que necessiten ''sudo''.
**Per treballar com a desenvolupador NO cal fer ''sudo''**, llevat de poquíssimes excepcions.
Si estem en producció, potser cal algun cop (quan estem en carpetes del sistema), però estigueu atents a fer-ho quan sigui necessari i no fer-ho perquè sí o perquè la instrucció no funciona sense examinar perquè no va.
**La gestió del permisos i propietat dels arxius és fonamental per a la seguretat**.
\\
===== Utilitzant virtualenv =====
* Activem el virtualenv:$ source envtest/bin/activate
* Veureu que el //prompt// ara indica el nom del ''virtualenv''. Si ara mirem les llibreries veurem que està buit:(envtest) $ pip3 freeze
* Podem instal·lar la primera llibreria, per exemple:(envtest) $ pip3 install flask
* Si comproveu amb ''pip3 freeze'' veureu que apareix la llibreria //flask// i totes les seves dependències.
* En qualsevol moment podem sortir del nostre ''virtualenv'' amb la instrucció ''deactivate'':(envtest) $ deactivate
\\
===== requirements.txt =====
Una bona pràctica habitual en els projectes desenvolupats en Python és disposar d'un arxiu ''requirements.txt'' en l'arrel del projecte que indiqui quines llibreries hem d'instal·lar perquè el projecte funcioni.
click==8.0.3
Flask==2.0.2
importlib-metadata==4.8.1
itsdangerous==2.0.1
Jinja2==3.0.2
MarkupSafe==2.0.1
pkg-resources==0.0.0
typing-extensions==3.10.0.2
Werkzeug==2.0.2
zipp==3.6.0
\\
===== Creant arxiu requirements.txt =====
Per crear l'arxiu, cal que estiguem en el ''virtualenv'' pertinent. Volcarem les seves llibreries amb:
(env) $ pip freeze > requirements.txt
Recordeu incloure ''requirements.txt'' en el [[vcs|sistema de control de versions]], típicament amb [[Git]]:
(env) $ git add requirements.txt
\\
===== Carregant la configuració d'un requirements.txt =====
Si estem posant en marxa un projecte que acabem de descarregar, podem carregar les seves llibreries.
- Si cal, creem un ''virtualenv'' per aïllar-nos del SO i dels altres projectes. Per exemple, amb el //built-in// ''venv'':python -m venv env
- Activem el ''virtualenv'':$ source env/bin/activate
- Ara ja podem carregar les llibreries:(env) $ pip install -r requirements.txt
\\