# Environnement virtuel en Python (> 3.3) ### venv On crée un dossier pour regrouper tous les environnements virtuels: ```bash $ cd $ mkdir venv $ cd venv ``` On crée l'environnement virtuel 'tuto-virtuel-env': ```bash $ python -m venv tuto-virtuel-env $ cd tuto-virtuel-env/ total 8 drwxr-xr-x 6 bruno staff 192 15 mar 07:29 . drwxr-xr-x 3 bruno staff 96 15 mar 07:29 .. drwxr-xr-x 12 bruno staff 384 15 mar 07:29 bin drwxr-xr-x 2 bruno staff 64 15 mar 07:29 include drwxr-xr-x 3 bruno staff 96 15 mar 07:29 lib -rw-r--r-- 1 bruno staff 105 15 mar 07:29 pyvenv.cfg ``` L'environnement est crée avec la version courante de Python. Si plusieurs versions de Python sont installées sur le système, on peut spécifier une version particulière en exécutant `python3.x`: ```bash $ python3.6 -m venv tuto-venv-py36 ``` On peut créer un environnement sans `pip`: ```bash $ python -m venv env-sans-pip --without-pip $ source env-sans-pip/bin/activate (env-sans-pip) bruno@SilverBook:~/venv$ pip Traceback (most recent call last): File "/usr/local/lib/python3.7/site-packages/pkg_resources/__init__.py", line 583, in _build_master ``` On l'active: ```bash # Pour bash: $ source tuto-virtuel-env/bin/activate (tuto-virtuel-env) bruno@SilverBook:~/venv$ # Pour csh ou fish: activate.csh activate.fish ``` On lance Python: ```bash (tuto-virtuel-env) bruno@SilverBook:~/venv$ python Python 3.7.2 (default, Feb 12 2019, 08:15:36) [Clang 10.0.0 (clang-1000.11.45.5)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> import sys >>> sys.path ['', '/usr/local/lib/python3.7/site-packages', '/usr/local/Cellar/python/3.7.2_2/Frameworks/Python.framework/Versions/3.7/lib/python37.zip', '/usr/local/Cellar/python/3.7.2_2/Frameworks/Python.framework/Versions/3.7/lib/python3.7', '/usr/local/Cellar/python/3.7.2_2/Frameworks/Python.framework/Versions/3.7/lib/python3.7/lib-dynload', '/Users/bruno/venv/tuto-virtuel-env/lib/python3.7/site-packages'] ``` Sortir de l'environnement virtuel: ```bash (tuto-virtuel-env) bruno@SilverBook:~/venv$ deactivate bruno@SilverBook:~/venv$ ``` Contenu de l'environnement virtuel: ```bash (tuto-virtuel-env) bruno@SilverBook:~/venv/tuto-virtuel-env$ cd bin/ total 64 drwxr-xr-x 12 bruno staff 384 15 mar 07:29 . drwxr-xr-x 6 bruno staff 192 15 mar 07:29 .. -rw-r--r-- 1 bruno staff 2234 15 mar 07:29 activate -rw-r--r-- 1 bruno staff 1290 15 mar 07:29 activate.csh -rw-r--r-- 1 bruno staff 2442 15 mar 07:29 activate.fish -rwxr-xr-x 1 bruno staff 263 15 mar 07:29 easy_install -rwxr-xr-x 1 bruno staff 263 15 mar 07:29 easy_install-3.7 -rwxr-xr-x 1 bruno staff 245 15 mar 07:29 pip -rwxr-xr-x 1 bruno staff 245 15 mar 07:29 pip3 -rwxr-xr-x 1 bruno staff 245 15 mar 07:29 pip3.7 lrwxr-xr-x 1 bruno staff 51 15 mar 07:29 python -> /usr/local/Cellar/python/3.7.2_2/libexec/bin/python lrwxr-xr-x 1 bruno staff 6 15 mar 07:29 python3 -> python (tuto-virtuel-env) bruno@SilverBook:~/venv/tuto-virtuel-env/bin$ which pip3 /Users/bruno/venv/tuto-virtuel-env/bin/pip3 (tuto-virtuel-env) bruno@SilverBook:~/venv/tuto-virtuel-env/bin$ which python3 /Users/bruno/venv/tuto-virtuel-env/bin/python3 ``` Mettre-à-jour `pip`, `setuptools` et installer `wheel`: ```bash (tuto-virtuel-env) bruno@SilverBook:~/venv/tuto-virtuel-env/bin$ pip3 install -U pip setuptools wheel ``` Installer un module avec `pip`: ```bash (tuto-virtuel-env) bruno@SilverBook:~/venv/tuto-virtuel-env/bin$ pip3 install easy-parse (tuto-virtuel-env) bruno@SilverBook:~/venv/tuto-virtuel-env/bin$ pip3 freeze ... docutils==0.14 easy-parse==0.1.1 entrypoints==0.3 ... (tuto-virtuel-env) bruno@SilverBook:~/venv/tuto-virtuel-env/bin$ deactivate bruno@SilverBook:~/venv/tuto-virtuel-env/bin$ pip3 freeze ... docutils==0.14 entrypoints==0.3 ... ``` Le module installé dans l'environnement virtuel est disponible UNIQUEMENT dans l'environnement virtuel. [https://www.python.org/dev/peps/pep-0405/](https://www.python.org/dev/peps/pep-0405/) [https://docs.python.org/fr/3/library/venv.html](https://docs.python.org/fr/3/library/venv.html) #### Virtual environnment courant: ```python ❯ python Python 3.9.6 (default, Jun 28 2021, 19:24:41) [Clang 12.0.5 (clang-1205.0.22.9)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> import sys >>> print(sys.prefix) /Users/bruno/Documents/venv/soco-cli >>> print(sys.executable) /Users/bruno/Documents/venv/soco-cli/bin/python >>> ``` ```bash ❯ which -a python /Users/bruno/Documents/venv/soco-cli/bin/python /usr/bin/python ``` ### pyvenv #### Installer des modules pour un projet: ```bash cd myproject pipenv install requests ``` ### Mise-à-jour de Python dans un venv 1. On sauvegarde les dépendances: ```bash ~/Documents/venv mkdocs soco-cli ❯ source soco-cli/bin/activate soco-cli ❯ pip3 freeze > requirements.txt soco-cli ❯ deactivate ``` 2. On supprime le venv: ```bash ❯ rm -rf soco-cli ``` 3. On recrée le venv (avec la version courante de python): ```bash # avec la version courante de python: ❯ python3 -m venv soco-cli # avec une version précise de python: ❯ python3.10 -m venv soco-cli ``` 4. On met à jour les outils: ```bash ❯ source soco-cli/bin/activate soco-cli ❯ pip3 install -U pip setuptools wheel ``` 5. On réinstalle les dépendances: ```bash soco-cli ❯ pip3 install -r requirements.txt soco-cli ❯ deactivate ``` ``` ❯ $HOME/Documents/venv/soco-cli/bin/soco -v soco-cli version: 0.4.52 soco version: 0.28.0 python version: 3.10.8 command path: /Users/bruno/Documents/venv/soco-cli/bin/soco ``` ### Installer LiveboxMonitor dans un venv Cloner le [dépot](https://p-dor.github.io/LiveboxMonitor/): ```bash ~/Downloads $ git clone https://github.com/p-dor/LiveboxMonitor.git ``` Créer le venv: ```bash ~/Documents/venv $ python -m venv liveboxmonitor ``` Activer le venv: ```bash ~/Documents/venv $ source liveboxmonitor/bin/activate ``` Mettre à jour: ```bash ~/Documents/venv liveboxmonitor ❯ pip3 install -U pip setuptools wheel Requirement already satisfied: pip in ./liveboxmonitor/lib/python3.10/site-packages (23.0) Requirement already satisfied: setuptools in ./liveboxmonitor/lib/python3.10/site-packages (67.2.0) Collecting setuptools ``` Copier LiveboxMonitor dans le venv: ```bash ~/Downloads/LiveboxMonitor $ cp -R * ~/Documents/venv/liveboxmonitor ``` Installer les dépendances: ```bash ~/Documents/venv/liveboxmonitor liveboxmonitor ❯ pip3 install -r requirements.txt Collecting PyQt6 ``` Créer un exécutable avec [PyInstaller](https://pyinstaller.org/en/stable/index.html): ```bash pyinstaller --paths liveboxmonitor/lib/python3.10/site-packages LiveboxMonitor.py # Ne marche pas: PyQt6 est installé dans /opt/homebrew/lib ``` https://stackoverflow.com/questions/55312146/how-to-include-only-needed-modules-in-pyinstaller#55312170