|
|
Installer Python une première fois ne pose en général pas de problème, et on ajoute en général sans trop de problème des librairies au fur et à mesure des besoins, en ligne de commande ou depuis son IDE.
|
|
|
|
|
|
<details><summary>rappels, comment installer une librairie</summary>
|
|
|
Cas général, en ligne de commande : $ pip install ma_librairie
|
|
|
Avec Anaconda ou miniconda : $ conda install ma_librairie update conda
|
|
|
Avec un IDE, par exemple PyCharm : aller dans Files / Settings / Project / Python Interpreter ; cliquez sur le "+" en haut à gauche.
|
|
|
</details>
|
|
|
|
|
|
|
|
|
|
|
|
Pour vérifier quelles bibliothèques sont installées, et en quelle **version**, vous pouvez donc consulter la liste depuis votre IDE ou taper en ligne de commande **pip freeze**.
|
|
|
Attention, si vous voulez mettre à jour une librairie existante, il ne suffit pas de refaire la manip d'installation, il faut préciser que vous voulez l'upgrader.
|
|
|
|
|
|
<details><summary>rappels, comment upgrader une librairie</summary>
|
|
|
Cas général, en ligne de commande : $ pip install --upgrade ma_librairie
|
|
|
Avec Anaconda ou miniconda : $ conda update ma_librairie
|
|
|
Avec un IDE, par exemple PyCharm : aller dans Files /.../ Python Interpreter, vous avez la liste des modules avec "Version" et "Latest Version"; cliquez sur le numéro de la dernière version
|
|
|
</details>
|
|
|
|
|
|
Les ennuis commencent en général quand on a besoin d'une version particulière d'
|
|
|
est installé, on peut un jour avoir envie de le mettre à jour (la dernière version est actuellement 3.10, il y a maintenant environ une mise à jour par an).
|
|
|
|
|
|
On peut installer Python pour tous les utilisateurs du PC (donc en mode admin) ou seulement pour soi...
|
|
|
Mais on peut également conserver une version antérieure, car on est sûr que nos codes tournent bien avec..
|
|
|
Et puis on a besoin d'installer des paquets, et également de les mettre à jour, éventuellement en gardant aussi une version sous le coude...
|
|
|
Bref, on s'y perd vite.
|
|
|
|
|
|
Quelques ressources :
|
|
|
- tuto du site [Pypi](https://packaging.python.org/tutorials/installing-packages/) qui met à disposition un catalogue de paquets
|
|
|
- une fois de plus, le cours de [X. Garrido, section gérer son environnement
|
|
|
](https://xgarrido.github.io/licence_python_teaching/pdf/01_slide_environnement.pdf)
|
|
|
- [Python Doctor, en français](https://python.doctor)
|
|
|
- [OpenClassRoom](https://openclassrooms.com/fr/courses/6951236-mettez-en-place-votre-environnement-python/7013349-decouvrez-les-paquets-python)
|
|
|
|
|
|
|
|
|
### point de vocabulaire : script, module, paquets, ajouter enironnements virtuels**...
|
|
|
|
|
|
Un **script** est un programme sauvegardé dans un fichier **mon_code.py** (par opposition à des instructions tapées dans la console, qui seront perdues...).
|
|
|
Quand votre programme va grossir, vous avez intérêt à structurer votre code en plusieurs fichiers, et éventuellement à utiliser du code déjà écrit dans d'autres fichiers *.py. Vous pouvez alors importer les fonctions et/ou les variables de ces codes, considérés comme **modules**.
|
|
|
Il faut que ces fichiers *.py soient dans le même répertoire que votre script, ou dans un répertoire connu par Python dont la liste est le Python PATH, voir [ce tuto](https://python.doctor/page-python-path-pythonpath).
|
|
|
Le plus simple est de les gérer avec votre IDE dans un même "projet", et dans le même répertoire, surtout si vous travaillez à plusieurs : si vous oubliez d'envoyer un des fichiers le code sera inutilisable...
|
|
|
|
|
|
Si vous voulez vraiment garder un fichier module commun à plusieurs projets, modifiez le Python PATH, ou ajoutez le chemin vers le fichier dans le code.
|
|
|
|
|
|
|
|
|
```Python
|
|
|
import sys
|
|
|
sys.path.insert(0, "/home/olivier/scripts") # oui, j'ai piqué l'exemple à Python Doctor tel quel
|
|
|
```
|
|
|
La syntaxe d'import ne fait pas de différence entre des fichiers pythons faits par vous et des packages externes installés (contrairement à d'autres langages qui distinguent include et import)
|
|
|
|
|
|
```Python
|
|
|
# j'ai besoin de tout ce qu'il y a dans le fichier, je sais ce qu'il y a dedans, il est fait pour mon script
|
|
|
from mon_fichier_de_fonctions import * # je peux utiliser la fonction du module via leur nom
|
|
|
import mon_fichier_de_fonctions # je peux utiliser la fonction du module via l mon_fichier_de_fonctions.nom_de_fonction
|
|
|
# je ne connais pas tout ce qu'il y a dans ce module, tout ne m'intéresse pas
|
|
|
# je n'ai besoin que de quelques fonctions et des variables
|
|
|
from mon_module import ma_fonction_1, ma_fonction_32, ma_classe_71, ma_variable_12, ma_variable2
|
|
|
```
|
|
|
|
|
|
:warning:vous utiliserez ces autres fichiers *.py pour leurs classes, leurs fonctions et leurs variables, mais peut-être ont-ils aussi un "corps principal", i.e des instructions... Si vous appelez le module avec **import *** elles vont s'exécuter !
|
|
|
|
|
|
Pour éviter cela :
|
|
|
1)construisez des modules qui ne contiennent que des classes, fonctions et variables
|
|
|
2) si vous avez quand même besoin d'écrire des instructions dans leur corps de programme, pour débuguer ou pour une utilisation spécifique, testez si ce fichier est exécuté en tant que **script** ou bien appelé par un autre code :
|
|
|
```Python
|
|
|
if __name__ == __main__:
|
|
|
# les instructions suivantes sont donc exécutées
|
|
|
print("ce fichier est exécuté en tant que script ")
|
|
|
else:
|
|
|
# ce fichier est importé en tant que module par un autre script
|
|
|
print("j'ai rarement intérêt à exécuter du code dans un module, peut être quelques initialisations")
|
|
|
```
|
|
|
Remarque :
|
|
|
- on peut aussi **importer des modules dans la console** ! Ils seront connus pour tout le reste de la session...
|
|
|
- on peut aussi **importer des modules dans la Jupyterlab** pour ne pas surcharger le notebook et créer des séquences interminables !
|
|
|
:warning: les modules importés dans la console ou dans Jupyter sont importés tels quels et seront connus pour tout le reste de la session... Si vous effectuez des modifications sur le fichier elles ne seront pas prises en compte ! Il faut désinstaller le module ou, avec la console, démarrer une nouvelle session et réimporter.
|
|
|
|
|
|
**Un paquet** est un ensemble de modules, structurés dans une arborescence. Matplotlib est un paquet, pyplot en est l'un des modules.
|
|
|
|
|
|
Il est fortement déconseillé de tout importer en bloc avec import module * sauf si vous avez vous-même codé ces modules et que vous êtes certains qu'il n'y a pas d'homonyme... car si deux modules contiennent un objet homonyme votre code va faire des choses bizarres...
|
|
|
|
|
|
```Python
|
|
|
from matplotlib.pyplot import * : vous avez accès à tous les objets de pyplot sans préfixe mais fortement déconseillé ! !
|
|
|
from matplotlib import * # fortement déconseillé ; attention vous n'avez pas accès aux objets des sous-modules...
|
|
|
```
|
|
|
|
|
|
il vaut mieux écrire
|
|
|
|
|
|
```Python
|
|
|
import module_1 # accès à tous les objets avec module_1 .nom_objet
|
|
|
import module_2 # accès à tous les objets avec module_2 .nom_objet
|
|
|
|
|
|
```
|
|
|
Il est possible de définir un alias au nom de module. Certains modules, même avec des noms courts, ont des alias que tout le monde utilise par convention, ce qui facilite les échanges de code
|
|
|
|
|
|
```Python
|
|
|
import mon_module_avec_un_nom_super_detaille as module # accès à tous les objets avec module .nom_objet
|
|
|
|
|
|
from matplotlib import pyplot as plt # accès aux objets avec plt.nom_objet
|
|
|
import matplotlib.pyplot as plt # identique au précédent
|
|
|
|
|
|
import numpy as np # accès aux objets avec np.nom_objet
|
|
|
import pandas as pd # accès aux objets avec pd.nom_objet
|
|
|
import seaborn as sn # accès aux objets avec sn.nom_objet
|
|
|
```
|
|
|
|
|
|
Il est également possible d'importer sélectivement certains objets, éventuellement avec des alias
|
|
|
```Python
|
|
|
from tkinter import filedialog
|
|
|
from matplotlib.widgets import Slider, CheckButtons
|
|
|
from numpy.random import gumbel
|
|
|
from shapely import Polygon as PolygonShapely
|
|
|
|
|
|
```
|
|
|
|
|
|
Le code de certains paquets est totalement en Python ; c'est le cas de matplotlib et vous avez accès au code : pour d'autres ce sont des exécutables et/ou du code Python.
|
|
|
|
|
|
## Faire un bilan de ce qui est installé
|
|
|
Ouvrir une fenêtre "invite de commande"
|
|
|
|
|
|
>python --version
|
|
|
|
|
|
>Python 3.6.4
|
|
|
|
|
|
Apparemment, je suis restée au Python 3.6. Pourtant dans mon IDE je travaille avec Python 3.8. En fait, j'ai plusieurs versions installées, ce qui peut être pertinent à condition de savoir ce que l'on fait !
|
|
|
:warning: quand je vais installer de nouveaux modules avec pip, ils sont être associés à cette version mentionnée par python --version, donc dans cet exemple Python3.6
|
|
|
|
|
|
Dans un IDE, vous avez aussi quelque part dans "settings" l'information sur la version courante. Eventuellement, on vous demandera de préciser la version de Python à la création d'un projet.
|
|
|
|
|
|
On présente dans la suite comment gérer ses paquets et utiliser les bonnes version hors IDE (pip en invite de commande et venv), ce qui permet de présenter les notions. On mentionne ensuite que l'on peut tout gérer depuis son IDE, ce qui est souvent plus pratique.
|
|
|
Si on a plusieurs versions de Python et qu'on installe un module avec PIP, on peut avoir la désagréable surprise de ne pas avoir accès à ce module depuis son IDE... L'IDE permet de mieux visualiser ce que l'on installe pour quelle version de Python.
|
|
|
|
|
|
|
|
|
## installer des paquets et les mettre à jour
|
|
|
|
|
|
**Pypi** est le dépôt tiers officiel du langage de programmation Python. Son objectif est de doter la communauté des développeurs Python d'un catalogue complet recensant tous les paquets Python libres.
|
|
|
Voir le [site Pypi](https://pypi.org/).
|
|
|
Il est donc possible de récupérer facilement des tas de modules développés par d'autres.
|
|
|
On peut gérer ses depuis l'invite de commande avec PIP ou depuis votre IDE.
|
|
|
|
|
|
### avec PIP, Python Package Index
|
|
|
L'installeur de paquets PIP est fourni avec Python depuis la version 3.4.
|
|
|
Il fonctionne en ligne de commande dans l'invite de commande.
|
|
|
En windows, c'est la fenêtre sur fond noir qui rappelle l'époque du DOS... On l'ouvre sous windows avec le menu fenêtre, éventuellement en tant qu'administrateur : clic doit puis "exécuter en tant qu'administrateur)
|
|
|
|
|
|
>pip --version
|
|
|
|
|
|
>pip 20.2.3 from C:\Users\christine.poulard\AppData\Roaming\Python\Python36\site-packages\pip (python 3.6)
|
|
|
|
|
|
#### installer un paquet présent sur Pypi
|
|
|
|
|
|
Pour installer un paquet (et toutes ses dépendances) :
|
|
|
> pip install matplotlib
|
|
|
|
|
|
Dans certains cas, vous aurez besoin d'installer un paquet en spécifiant un chemin ; voir la doc de Pypi.
|
|
|
A partir du lien d'un git par exemple :
|
|
|
> python3 -m pip install -e git+https://git.repo/some_pkg.git#egg=SomeProject
|
|
|
|
|
|
Le nouveau paquet est disponible maintenant, mais pour l'utiliser dans un de vos codes il faudra d'abord l'importer en précisant en début de script ou dans la console pour une utilisation en console, par exemple :
|
|
|
from matplotlib import pyplot as plt
|
|
|
|
|
|
Suppression d’un paquet :
|
|
|
>pip uninstall matplotlib
|
|
|
|
|
|
#### vérifier les paquets installés
|
|
|
|
|
|
Avoir des infos sur un paquet :
|
|
|
>pip show matplotlib
|
|
|
|
|
|
>Name: matplotlib
|
|
|
Version: 3.3.4
|
|
|
Summary: Python plotting package
|
|
|
Home-page: https://matplotlib.org
|
|
|
Author: John D. Hunter, Michael Droettboom
|
|
|
Author-email: matplotlib-users@python.org
|
|
|
License: PSF
|
|
|
Location: c:\users\christine.poulard\appdata\local\programs\python\python36-32\lib\site-packages
|
|
|
Requires: cycler, numpy, pillow, python-dateutil, kiwisolver, pyparsing
|
|
|
Required-by: seaborn
|
|
|
|
|
|
Liste des modules utilisés, avec leur numéro de version
|
|
|
>pip freeze
|
|
|
|
|
|
>bleach==2.1.3
|
|
|
bokeh==2.2.1
|
|
|
certifi==2018.11.29
|
|
|
chardet==3.0.4
|
|
|
(...)etc.
|
|
|
|
|
|
Je découvre des paquets que je ne me souviens pas avoir installés (sans doute des **dépendances** d'autres paquets), des paquets que je n'ai pas utilisés depuis longtemps, et peut-être aussi des paquets que j'utilise tout le temps sans savoir qu'il existe des mises à jour qui m'attendent...
|
|
|
|
|
|
#### mettre à jour
|
|
|
|
|
|
A chaque nouvelle installation PIP vérifiera sa version et vous proposera éventuellement une mise à jour. Il ne s'en charge que pour lui-même !
|
|
|
Pour vérifier si vos paquets sont à jour et comparer votre version avec la dernière sortie :
|
|
|
|
|
|
>M:\>pip list --outdated
|
|
|
|
|
|
>Package Version Latest Type
|
|
|
-------------------- ---------- --------- -----
|
|
|
bleach 2.1.3 3.3.0 wheel
|
|
|
bokeh 2.2.1 2.3.2 sdist
|
|
|
certifi 2018.11.29 2020.12.5 wheel
|
|
|
chardet 3.0.4 4.0.0 wheel
|
|
|
(...)
|
|
|
cligj 0.4.0 0.7.1 wheel
|
|
|
cloudpickle 0.8.0 1.6.0 wheel
|
|
|
(...)
|
|
|
dask 1.1.1 2021.3.0 wheel
|
|
|
datashader 0.6.9 0.12.1 wheel
|
|
|
decorator 4.3.2 5.0.7 wheel
|
|
|
|
|
|
Si je cherche à réinstaller datashader, par exemple, PIP va me répondre qu'il est déjà là :
|
|
|
>pip install datashader
|
|
|
|
|
|
> Requirement already satisfied: datashader in c:\users\christine.poulard\appdata\local\programs\python\python36-32\lib\site-packages (0.6.9)
|
|
|
(...)
|
|
|
|
|
|
Pour forcer la mise à jour :
|
|
|
>pip install datashader --upgrade
|
|
|
|
|
|
> (...)
|
|
|
Installing collected packages: datashader
|
|
|
Attempting uninstall: datashader
|
|
|
Found existing installation: datashader 0.6.9
|
|
|
Uninstalling datashader-0.6.9:
|
|
|
Successfully uninstalled datashader-0.6.9
|
|
|
Successfully installed datashader-0.12.1
|
|
|
|
|
|
Sinon, je peux aussi installer un module d'une version précise :
|
|
|
> pip install matplotlib==1.5.0
|
|
|
|
|
|
Un de soucis de Python et ses modules est le manque de **rétrocompatibilité** : rien ne garantit que vos codes continueront à fonctionner tels quels au fur et à mesure des mises à jour. Les plus polis, comme Matplotlib vous préviennent que telle ou telle façon de faire ne sera bientôt plus possible (DeprecationWarning).
|
|
|
|
|
|
```Python
|
|
|
D:/2021_AtelierPython/main.py:69: MatplotlibDeprecationWarning:
|
|
|
The set_window_title function was deprecated in Matplotlib 3.4 and will be removed two minor releases later. Use manager.set_window_title or GUI-specific methods instead.
|
|
|
fig.canvas.set_window_title("ScE - Hydrologie - Démo probas crue sur N années")
|
|
|
```
|
|
|
|
|
|
|
|
|
:warning: une belle blague avec le module shapefile, utilisé dans l'atelier D (carte) !
|
|
|
> pip install pyshp
|
|
|
|
|
|
mais ensuite
|
|
|
```Python
|
|
|
import shapefile
|
|
|
```
|
|
|
#### Notion d'environnement virtuel avec venv
|
|
|
Pour s'y retrouver dans cette jungle de versions, dont on peut avoir besoin de l'une ou l'autre selon les cas, il existe la notion Environnements virtuel.
|
|
|
On déclare les paquets et leurs versions dans un fichier, et on rend le fichier actif avec venv
|
|
|
|
|
|
> python3.5 -m venv ~/python.d/my_python_env
|
|
|
|
|
|
Un environnement virtuel permet d’avoir des installations de Python isolées entre elles (une Python 3.6 et une Python 3.10) et de travailler avec différentes versions des modules selon les projets.
|
|
|
|
|
|
## Gestion des paquets avec votre IDE
|
|
|
Vous pouvez aussi gérer tout cela depuis votre IDE.
|
|
|
Voir la doc selon votre IDE ; cette partie sera complétée au besoin |
|
|
\ No newline at end of file |