% Programmation avec Python (chapitre 11) % Dimitri Merejkowsky
\center \huge Retour sur les exceptions
try:
fp = open("file.txt")
1 / 0
except ZeroDivisionError:
print("got you")
finally:
print("closing")
fp.close()
try:
fp = open("file.txt")
1 / 0
except ZeroDivisionError:
print("got you")
fp.close()
Que se passe-t-il si l’exception n’est pas ZeroDivisionError?
\center \huge Utiliser des bibliothèques tierces
import foo
answer = foo.get_answer()
Fonctionne si:
foo.py
quelque part qui contient une fonction get_answer
PATH="/bin:/usr/bin:/usr/sbin"
$ ifconfig
# résout sur /usr/sbin/ifconfig
$ ls
# résount sur /bin/ls
En Python c’est pareil.
import sys
print(sys.path)
* '' # vide = chemin courant
* /usr/lib/python3.7
* /usr/lib/python3.7/lib-dynload
* /home/dmerej/.local/lib/python3.7/site-packages
* /usr/lib/python3.7/site-packages
Seul deux des composants sont accessibles en écriture par mon utilisateur courant:
~/.local/lib/python3.7/site-packages/
)Même principe sur macOS et Windows (presque)
Par example, pour faire des jolis tableaux:
import tabulate
scores = [
["John", 345],
["Mary-Jane", 2],
["Bob", 543],
]
table = tabulate.tabulate(score)
print(table)
--------- ---
John 345
Mary-Jane 2
Bob 543
--------- ---
On peut trouver le code source de tabulate
facilement.
Mais comment faire pour le mettre dans sys.path
?
On peut récupérer les sources et les installer avec python3 setup.py install --user
Quasiment tous les projets python ont un setup.py
utilisable de cette façon.
On utilise --user
pour éviter des problèmes de permissions
Démo!
Un appel à setuptools.setup()
. C’est tout
from setuptools import setup
setup(
name='tabulate',
version='0.8.1',
description='Pretty-print tabular data',
py_modules=["tabulate"],
scripts=["bin/tabulate"],
...
)
Sur linux, si le paquet contient des scripts, ils arriveront dans ~/.local/bin
.
Sous macOS et Windows, ce sera un autre emplacement, mais qui dépendra de la version de Python.
python3 -m
quand c’est possible!pip
vient par défaut avec Python3get-pip.py
python3 -m pip
.Prenons une autre bibliothèque: cli-ui
.
Elle sert à faire des jolis programmes en couleur:
import cli_ui
cli_ui.info_1("Ceci est une info importante")
cli_ui.info("Ceci est en", cli_ui.bold, "gras")
En fait, cli-ui
utilise d’autres bibliothèques.
Par exemple:
headers=["name", "score"]
data = [
[(bold, "John"), (green, 10.0)],
[(bold, "Jane"), (green, 5.0)],
]
cli_ui.info_table(data, headers=headers)
Devinez qui s’occupe d’afficher le tableau!
Aussi dans setup.py:
setup(
name="cli-ui",
version="0.9.1",
install_requires=[
"tabulate",
...
],
...
)
Va chercher tout seul sur pypi
Lance setup.py
tout seul (pour trouver les dépendances, et les installer)
S’utilise avec python3 -m pip install --user ...
python3 -m pip uninstall <>
pypi
directement - python3 -m pip search <>
python3 -m pip list
--user
/usr/lib/
sous Linux),
pip ne saura pas le mettre à jour - il faudra passer par le gestionnaire de paquet de
la distributionParfois, les versions sont incompatibles entre elles!
https://tankerhq.github.io/python-cli-ui/changelog.html#v0-8-0
On peut donner des versions dans setup.py
:
install_requires=[
"cli-ui <= 0.8",
...
]
cli-ui
0.7cli-ui
0.9Comment faire pour travailler sur les deux projets?
python3 -m venv <le chemin>
- sauf sous Debian ;-(virtualenv
avec pip puis utiliser virtualenv
$ python3 -m pip install virtualenv --user
$ python3 -m virtualenv <le chemin>
~/.local/lib
Et vous avez aussi un pip
spécial dans /le chemin/bin/pip
--user
Si taper le chemin du virtualenv vous embête, vous pouves
l’activer avec source bin/activate
Pour sortir: deactivate
.
C’est plus long, mais ça vous évitera un tas de problèmes ...
requirements.txt
pipenv
poetry
Veillez à bien comprendre le problème que ces outils résolvent avant de vous en servir!
On y reviendra