Comment créer un package pip

J’ai remarqué que je recodais à longueur de journées les mêmes fonctions python ou que je n’arrivais pas à retrouver une fonction qui m’était utile dans le passé. J’ai donc décidé de me créer ma propre petite lib python avec toutes mes fonctions

Il était nécessaire que je puisse les avoir depuis n’importe quel PC et rapidement. J’ai donc naturellement pensé à PIP qui permet d’installer rapidement un package Python

pip install package_name

J’ai pu trouvé quelques tutoriaux sympas pour la création du squelette du package mais les méthodes pour uploader le package étaient deprecated.

Création du package

Deux fichiers sont nécessaires à minima :

  • setup.py

  • le_module.py

Par exemple pour créer le package xswitch contenant mes fonctions :

switch@RoG:/mnt/c/Users/switch/Desktop/xswitch$ tree
    .
    setup.py
    xswitch
        __init__.py
        xswitch.py              

setup.py

Il est nécessaire de créer un fichier de configuration contenant des informations sur le module.

J’utilise le module setuptools qui va permettre de créer ce fichier rapidement.

from setuptools import setup, find_packages

setup(
	name="xswitch",
	version="1.0.1",
	packages=find_packages(), # permet de récupérer tout les fichiers 
	description="My usefull functions",
	url="https://0xswitch.fr",
	author="switch",
	license="WTFPL",
	python_requires=">=2.7"
	)

De nombreux paramètres sont disponibles : https://packaging.python.org/tutorials/distributing-packages/ mais ceux que je vous ai présentés sont souvent suffisant.

Le paramètre install_requires peut être utile pour spécifier les dépendances de votre programme. Si elles ne sont pas disponibles lors de l’installation de votre package elles seront téléchargées et installées.

La méthode find_packages()”) peut prendre une liste d’arguments permettant d’inclure ou d’exclure certains fichiers.

le_module.py

J’ai choisi d’appeler ce fichier xswitch.py mais il aurait très bien pu être nommé autrement

#!/usr/bin/env python
#encoding: utf-8

import os 

def hello():

	if os.name != "nt":
		print """
        0xswitch.fr
			"""
	else:
		print """
  ___                    _ _       _        __      
 / _ \__  _______      _(_) |_ ___| |__    / _|_ __ 
| | | \ \/ / __\ \ /\ / / | __/ __| '_ \  | |_| '__|
| |_| |>  <\__ \\ V  V /| | || (__| | | |_|  _| |   
 \___//_/\_\___/ \_/\_/ |_|\__\___|_| |_(_)_| |_|  """ 
                                                  

if __name__ == "__main__":
	hello()

Ce fichier contiendra tout votre module, pour mon exemple il ne contient qu’une fonction : hello()

_init_.py

J’ai menti il existe un autre fichier _init_.py, il permet simplement de rendre l’accessibilité des fonctions plus simple mais il n’est pas obligatoire :

from xswitch import hello

Cela permet de faire

from xswitch import hello
au lieu de 
from xswitch.xswitch import hello

Merci Sam & Max

Distribution du package

Auparavant il était possible d’uploader le fichier directement sur pypi.org via une commande :

python setup.py register -r pypi

Mais elle est deprecated, dorénavant il est obligatoire de créer un compte sur : https://pypi.org/account/register/ pour pouvoir uploader son projet.

Une fois la création du compte effectué, il n’y a plus qu’a uploader le package

python setup.py install # test le fonctionnement du module
python -m xswitch.xswitch # devrait afficher un magnifique message

# si l'étape précédente a fonctionné
python setup.py sdist # permet de créer votre archive tar.gz contenant votre module dans le répertoire dist/
twine upload dist/*  -u username -p password # permet d'uploader le package (ce sont les ID de votre compte pypi)

Votre package sera alors disponible à l’adresse suivante : https://pypi.org/project/votre_projet/

Mon projet est à l’adresse suivante : https://pypi.org/project/xswitch/

Il existe également https://test.pypi.org/manage/projects/ qui est identique mais est utilisé pour le développement et non la production.

Installation