Travailler sur une lib externe à votre projet proprement en Python
lundi 6 octobre 2014 à 14:53Quand on a une lib externe en dépendance à son projet, on veut être capable de l’importer MAIS pouvoir en modifier le code.
L’installer avec pip
ou python setup.py install
va copier le code dans le dossier site-packages
et ce n’est pas ce que l’on veut car ça oblige à refaire l’installation à chaque modif.
Le mettre dans un dossier “libs” qu’on ajoute au PYTHON PATH
ou pire, ajouter chaque dépendance au PYTHON PATH
n’est pas une solution qu’on est fier d’exhiber au hackerspace du coin.
On s’en remet donc généralement à un symlink, sans savoir qu’il existe en fait un outil fait pour ça :
python setup.py develop |
Cette commande va ajouter des entrées spéciales dans des fichiers placés dans site-packages
qui vont vous permettre d’utiliser votre lib comme si elle était installée. Mais en vérité il va chercher le code dans votre dossier de dev, donc si vous modifiez le code, vous avez toujours la version de votre lib la plus fraîche.
Une fois qu’on a une lib stable, on peut retirer ce lien avec :
python setup.py develop --uninstall |
Et installer la lib normalement.
Notez que tout ceci ne fonctionne que si le setup.py
utilise setuptools
et non distutils
qui provoque l’erreur error: invalid command ‘develop’.
Comme setuptools
inclut maintenant le meilleur de distutils
, on peut remplacer :
from distutils.core import setup |
Par :
from setuptools import setup |
Sans soucis.
pip
vient lui aussi avec un outil pour ça en la forme du flag -e
qui fait exactement la même chose. Exemple :
pip install -e /chemin/local/vers/projet |
Cela fonctionne comme pour python setup.py develop --uninstall
mais on bénéficie de tous les goodies de pip
en prime.
Néanmoins, pip
pousse plus loin l’automatisation. Si vous faites pip install -e
sur un repo distant, il va également cloner pour vous le code.
Ex :
pip install -e git+https://git@github.com/sametmax/minibelt.git#egg=minibelt |
Et on retrouvera un clone du projet dans /chemin/vers/virtualenv/src/
qui sera importable, modifiable et pushable. Le résultat est automatisable, puisque pip freeze
le prend en compte:
$ pip freeze argparse==1.2.1 -e git+https://git@github.com/sametmax/minibelt.git@b898155b40d7de73cc404db7d274128f2b2fc330#egg=minibelt-master wsgiref==0.1.2 |
L’URL est assez batarde à trouver par contre, car elle doit toujours finir par #egg=nom-du-projet
et commencer par un double protocole, celui du VCS et celui du transport.
P.S: j’ai remis la coloration syntaxique et les iframes (donc la musique). J’aime bien ce thème là, mais la header chie sa mère. Est-ce que vous l’aimez suffisamment pour que je me casse le cul à le réparer ?