|
@@ -7,25 +7,25 @@ |
|
|
|
|
|
|
|
|
```python |
|
|
```python |
|
|
try: |
|
|
try: |
|
|
fp = open("file.txt") |
|
|
|
|
|
|
|
|
file = open("file.txt") |
|
|
1 / 0 |
|
|
1 / 0 |
|
|
except ZeroDivisionError: |
|
|
except ZeroDivisionError: |
|
|
print("got you") |
|
|
print("got you") |
|
|
finally: |
|
|
finally: |
|
|
print("closing") |
|
|
print("closing") |
|
|
fp.close() |
|
|
|
|
|
|
|
|
file.close() |
|
|
``` |
|
|
``` |
|
|
|
|
|
|
|
|
# versus |
|
|
# versus |
|
|
|
|
|
|
|
|
```python |
|
|
```python |
|
|
try: |
|
|
try: |
|
|
fp = open("file.txt") |
|
|
|
|
|
|
|
|
file = open("file.txt") |
|
|
1 / 0 |
|
|
1 / 0 |
|
|
except ZeroDivisionError: |
|
|
except ZeroDivisionError: |
|
|
print("got you") |
|
|
print("got you") |
|
|
|
|
|
|
|
|
fp.close() |
|
|
|
|
|
|
|
|
file.close() |
|
|
``` |
|
|
``` |
|
|
|
|
|
|
|
|
# Réponse: |
|
|
# Réponse: |
|
@@ -41,18 +41,18 @@ Que se passe-t-il si l'exception *n'est pas* ZeroDivisionError? |
|
|
```python |
|
|
```python |
|
|
import foo |
|
|
import foo |
|
|
|
|
|
|
|
|
answer = foo.get_answer() |
|
|
|
|
|
|
|
|
foo.bar() |
|
|
``` |
|
|
``` |
|
|
|
|
|
|
|
|
Fonctionne si: |
|
|
Fonctionne si: |
|
|
|
|
|
|
|
|
* Il y a un `foo.py` quelque part qui contient une fonction `get_answer` |
|
|
|
|
|
|
|
|
* Il y a un `foo.py` quelque part qui contient une fonction `bar` |
|
|
* Dans le dossier courant |
|
|
* Dans le dossier courant |
|
|
* Ou dans la bibliothèque standard Python |
|
|
* Ou dans la bibliothèque standard Python |
|
|
|
|
|
|
|
|
# Parlons de PATH |
|
|
# Parlons de PATH |
|
|
|
|
|
|
|
|
* Vous connaissez peut-être la variable PATH, qui dit |
|
|
|
|
|
|
|
|
* Vous connaissez peut-être la variable d'environement PATH, qui dit |
|
|
où sont les exécutables. |
|
|
où sont les exécutables. |
|
|
|
|
|
|
|
|
```bash |
|
|
```bash |
|
@@ -60,9 +60,11 @@ PATH="/bin:/usr/bin:/usr/sbin" |
|
|
$ ifconfig |
|
|
$ ifconfig |
|
|
# résout sur /usr/sbin/ifconfig |
|
|
# résout sur /usr/sbin/ifconfig |
|
|
$ ls |
|
|
$ ls |
|
|
# résount sur /bin/ls |
|
|
|
|
|
|
|
|
# résout sur /bin/ls |
|
|
``` |
|
|
``` |
|
|
|
|
|
|
|
|
|
|
|
Résoudre: trouver le premier élément dans la liste. |
|
|
|
|
|
|
|
|
# sys.path |
|
|
# sys.path |
|
|
|
|
|
|
|
|
En Python c'est pareil. |
|
|
En Python c'est pareil. |
|
@@ -82,7 +84,7 @@ print(sys.path) |
|
|
* /usr/lib/python3.7/site-packages |
|
|
* /usr/lib/python3.7/site-packages |
|
|
``` |
|
|
``` |
|
|
|
|
|
|
|
|
* Le chemin courant à la priorité sur la bibliothèque standard! |
|
|
|
|
|
|
|
|
* Le chemin courant a la priorité sur la bibliothèque standard! |
|
|
|
|
|
|
|
|
# À noter |
|
|
# À noter |
|
|
|
|
|
|
|
@@ -124,6 +126,12 @@ On peut trouver le code source de `tabulate` facilement. |
|
|
|
|
|
|
|
|
Mais comment faire pour le mettre dans `sys.path`? |
|
|
Mais comment faire pour le mettre dans `sys.path`? |
|
|
|
|
|
|
|
|
|
|
|
# Dans la distribution |
|
|
|
|
|
|
|
|
|
|
|
Si vous êtes sous Linux, peut-être que vous pouvez utiliser votre |
|
|
|
|
|
gestionnaire de paquets. |
|
|
|
|
|
|
|
|
|
|
|
Du genre: `sudo apt install python3-tabulate`. |
|
|
|
|
|
|
|
|
# À la main |
|
|
# À la main |
|
|
|
|
|
|
|
@@ -157,14 +165,14 @@ Sur linux, si le paquet contient des *scripts*, ils arriveront dans `~/.local/bi |
|
|
|
|
|
|
|
|
Sous macOS et Windows, ce sera un autre emplacement, mais qui *dépendra de la version de Python*. |
|
|
Sous macOS et Windows, ce sera un autre emplacement, mais qui *dépendra de la version de Python*. |
|
|
|
|
|
|
|
|
* Utilisez `python3 -m` quand c'est possible! |
|
|
|
|
|
|
|
|
Il faudra peut-être changer le PATH sur votre machine si vous voulez lancer les scripts |
|
|
|
|
|
directement. Ou alors, utilisez `python3 -m` (quand c'est possible). |
|
|
|
|
|
|
|
|
|
|
|
Example: |
|
|
|
|
|
|
|
|
# Avec pip |
|
|
|
|
|
|
|
|
|
|
|
* `pip` vient par défaut avec Python3 |
|
|
|
|
|
* Vous pouvez aussi l'installer avec `get-pip.py` |
|
|
|
|
|
* Toujours le lancer avec `python3 -m pip`. |
|
|
|
|
|
|
|
|
``` |
|
|
|
|
|
python3 -m tabulate |
|
|
|
|
|
``` |
|
|
|
|
|
|
|
|
# Dépendances |
|
|
# Dépendances |
|
|
|
|
|
|
|
@@ -212,6 +220,20 @@ setup( |
|
|
) |
|
|
) |
|
|
``` |
|
|
``` |
|
|
|
|
|
|
|
|
|
|
|
# pypi |
|
|
|
|
|
|
|
|
|
|
|
pypi.org: un site que recense plein de bibliothèques python. |
|
|
|
|
|
|
|
|
|
|
|
Vive l'open source! |
|
|
|
|
|
|
|
|
|
|
|
cli-ui et tabulate y sont présents. |
|
|
|
|
|
|
|
|
|
|
|
# pip |
|
|
|
|
|
|
|
|
|
|
|
* `pip` vient par défaut avec Python3 |
|
|
|
|
|
* Vous pouvez aussi l'installer avec `get-pip.py` (python3 get-pip.py --user) |
|
|
|
|
|
* Toujours le lancer avec `python3 -m pip`. |
|
|
|
|
|
|
|
|
# Intérêt de pip |
|
|
# Intérêt de pip |
|
|
|
|
|
|
|
|
* Va chercher tout seul sur `pypi` |
|
|
* Va chercher tout seul sur `pypi` |
|
@@ -220,11 +242,12 @@ setup( |
|
|
* S'utilise avec `python3 -m pip install --user ...` |
|
|
* S'utilise avec `python3 -m pip install --user ...` |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Fonctionnalités en plus |
|
|
# Fonctionnalités en plus |
|
|
|
|
|
|
|
|
* Peut supprimer quelque chose installé - `python3 -m pip uninstall <>` |
|
|
* Peut supprimer quelque chose installé - `python3 -m pip uninstall <>` |
|
|
* Peut chercher sur `pypi` directement - `python3 -m pip search <>` |
|
|
* Peut chercher sur `pypi` directement - `python3 -m pip search <>` |
|
|
* Peut lister ce qui est installé - `python3 -m pip list` |
|
|
|
|
|
|
|
|
* Peut lister ce qui est installé - `python3 -m pip freeze` |
|
|
|
|
|
|
|
|
# Limitations de pip seul |
|
|
# Limitations de pip seul |
|
|
|
|
|
|
|
@@ -232,6 +255,8 @@ setup( |
|
|
* Si le paquet est déjà installé dans le système (genre `/usr/lib/` sous Linux), |
|
|
* Si le paquet est déjà installé dans le système (genre `/usr/lib/` sous Linux), |
|
|
pip ne saura pas le mettre à jour - il faudra passer par le gestionnaire de paquet de |
|
|
pip ne saura pas le mettre à jour - il faudra passer par le gestionnaire de paquet de |
|
|
la distribution |
|
|
la distribution |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Versions de dépendances |
|
|
# Versions de dépendances |
|
|
|
|
|
|
|
@@ -245,11 +270,21 @@ On peut donner des versions dans `setup.py`: |
|
|
|
|
|
|
|
|
```python |
|
|
```python |
|
|
install_requires=[ |
|
|
install_requires=[ |
|
|
"cli-ui <= 0.8", |
|
|
|
|
|
|
|
|
"cli-ui < 0.8", |
|
|
... |
|
|
... |
|
|
] |
|
|
] |
|
|
``` |
|
|
``` |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Apparté - pourquoi sudo pip c'est pas une bonne idée |
|
|
|
|
|
|
|
|
|
|
|
Les fichiers dans `/usr/lib` sont contrôllés par votre gestionnaire de paquet. |
|
|
|
|
|
|
|
|
|
|
|
Les mainteneurs de votre distribution font en sorte qu'ils marchent bien les uns |
|
|
|
|
|
avec les autres. |
|
|
|
|
|
|
|
|
|
|
|
Si vous lancer `sudo pip` vous risquez de casser votre système. |
|
|
|
|
|
|
|
|
# Plusieurs projets |
|
|
# Plusieurs projets |
|
|
|
|
|
|
|
|
* Projet A utilise `cli-ui` 0.7 |
|
|
* Projet A utilise `cli-ui` 0.7 |
|
@@ -259,7 +294,7 @@ Comment faire pour travailler sur les deux projets? |
|
|
|
|
|
|
|
|
# Environements virtuels |
|
|
# Environements virtuels |
|
|
|
|
|
|
|
|
* Un chemin *isolé* du reste du système. |
|
|
|
|
|
|
|
|
* Un répertoire *isolé* du reste du système. |
|
|
* Contient un binaire python légèrement différent du binaire ordinaire. |
|
|
* Contient un binaire python légèrement différent du binaire ordinaire. |
|
|
* Se crée avec `python3 -m venv <le chemin>` - sauf sous Debian ;-( |
|
|
* Se crée avec `python3 -m venv <le chemin>` - sauf sous Debian ;-( |
|
|
|
|
|
|
|
@@ -302,13 +337,11 @@ C'est plus long, mais ça vous évitera un tas de problèmes ... |
|
|
|
|
|
|
|
|
# Pour aller plus loin |
|
|
# Pour aller plus loin |
|
|
|
|
|
|
|
|
|
|
|
* PYTHONPATH |
|
|
* `requirements.txt` |
|
|
* `requirements.txt` |
|
|
* `pipenv` |
|
|
* `pipenv` |
|
|
* `poetry` |
|
|
* `poetry` |
|
|
|
|
|
|
|
|
Veillez à bien comprendre le problème que ces outils résolvent avant de vous |
|
|
|
|
|
en servir! |
|
|
|
|
|
|
|
|
|
|
|
On y reviendra |
|
|
On y reviendra |
|
|
|
|
|
|
|
|
# |
|
|
# |
|
|