Ce mois nous allons voir comment packager votre librairie python notamment pour la publier sur pypi, un gestionnaire de librairies python.
Un package python est un "zip" qui contient les informations de votre librairie. On peut l'assimiler à un Jar en Java. Celui ci contient les informations du package comme sa description, ses dépendances, sa version de python ...
Ce format est utilisé par pypi, le dépôt officiel de python qui est géré par pip
Pour créer ce package il faut créer un fichier setup.py, à la racine de votre site, similaire à celui ci
Copier le code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 from setuptools import setup, find_packages from readme_renderer.markdown import render long_description = "" with open('README.md', encoding='utf-8') as file: long_description = file.read() setup( name = "myPck", version = "0.1.0", author="general03", author_email="general03@XXXXXX.com", license='MIT', description='The framework to use in python project', long_description=render(long_description), long_description_content_type="text/markdown", url="https://gitlab.server.com/general03/myPck.git", packages=find_packages(exclude=["testing"]), install_requires=[ 'requests' ], python_requires='>=3.7', classifiers=[ "Programming Language :: Python :: 3", "Development Status :: 4 - Beta", "Programming Language :: Python :: 3.7", "Topic :: Security" ], )
Il existe 2 manières pour créer ce package, soit en egg soit wheel
Copier le code
1 2 3 4 5 # To build egg python setup.py bdist_egg # To build wheel (better) python3 setup.py bdist_wheel
Il est préférable d'utiliser wheel qui est l'extension (.whl) la plus utilisée actuellement. De plus il est régi par la pep 427
Il est possible de créer 2 types de package :
- setup.py sdist crée une source distribution permettant de générer une archive avec les fichiers sources, données, setup.py... Cela permet de le recompiler sur n'importe quelle plateforme. Après le build un dossier dist sera créé avec le tar.gz à l'intérieur
- setup.py bdist (and bdist_*) crée un built distribution: il inclut les fichiers compilés ou binaires avec vos données mais sans le setup.py. Il va générer une archive dans le dossier dist qui dépendra de la platforme et de la version de Python. Il suffit simplement d'extraire l'archive sur le serveur pour que l'installation soit opérationnelle. Dans le cas de notre package wheel on fait un bdist_wheel, il va créer l'archive au format wheel
Pensez à bien ajouter le fichier __init__.py dans le dossier où vous avez vos fichiers à inclure !
Pour uploader le package sur un repo il faut commencer par mettre .pypirc à la racine de votre projet ou alors dans le home si vous travaillez sous Windows
Copier le code
1 2 3 4 5 6 [distutils] index-servers = local [local] repository: https://artifactory.domain.com/api/pypi/pypi-local username: <USERNAME>
Et ensuite il suffit de pousser le package sur le repo avec cette commande :
Copier le code
1 2 3 python setup.py sdist upload -r local or python setup.py bdist_wheel upload -r local
Pour cette dernière commande vous remarquez 2 nouveaux éléments apparus dans le dossier dist :
- un .tar.gz qui correspond à l'archive des sources
- un .whl qui est le build du package
Il faut toujours pousser les 2 extensions sur le repository. Comme cela si l'installation échoue il est possible de récupérer les sources et de compiler le package.
Il existe un outil twine qui permet de remplacer le setup.py upload avec une transaction sécurisée
Il faut installer cette librairie
Copier le code
1 pipenv install twine --dev
Attention car PyPi ne gère pas le Markdown, or nous avons besoin de lire le README.md pour renseigner le champ long_description du setup.py. Il faut donc le convertir avec
Copier le code
1 pipenv install readme-renderer cmarkgfm --dev
On vérifie que tout est correct avec
Copier le code
1 twine check dist/*
Et on pousse sur le serveur avec
Copier le code
1 twine upload dist/*