Étant donné que personne n'a encore abordé cette question du PO:
Ce que je voulais faire:
Rendre un module python installable avec "pip install ..."
Voici un exemple minimal absolu, montrant les étapes de base de la préparation et du téléchargement de votre package vers PyPI à l'aide de setuptools
et twine
.
Ce n'est en aucun cas un substitut à la lecture au moins du tutoriel , il y a beaucoup plus que ce qui est couvert dans cet exemple très basique.
La création du package lui-même est déjà couverte par d'autres réponses ici, alors supposons que nous avons cette étape couverte et notre structure de projet comme ceci:
.
└── hellostackoverflow/
├── __init__.py
└── hellostackoverflow.py
Pour l'utiliser setuptools
pour le packaging, nous devons ajouter un fichier setup.py
, celui-ci va dans le dossier racine de notre projet:
.
├── setup.py
└── hellostackoverflow/
├── __init__.py
└── hellostackoverflow.py
Au minimum, nous spécifions les métadonnées de notre package, notre setup.py
ressemblerait à ceci:
from setuptools import setup
setup(
name='hellostackoverflow',
version='0.0.1',
description='a pip-installable package example',
license='MIT',
packages=['hellostackoverflow'],
author='Benjamin Gerfelder',
author_email='benjamin.gerfelder@gmail.com',
keywords=['example'],
url='https://github.com/bgse/hellostackoverflow'
)
Depuis que nous avons défini license='MIT'
, nous incluons une copie dans notre projet comme LICENCE.txt
, à côté d'un fichier readme dans reStructuredText comme README.rst
:
.
├── LICENCE.txt
├── README.rst
├── setup.py
└── hellostackoverflow/
├── __init__.py
└── hellostackoverflow.py
À ce stade, nous sommes prêts à commencer à emballer en utilisant setuptools
, si nous ne l'avons pas déjà installé, nous pouvons l'installer avec pip
:
pip install setuptools
Pour ce faire et créer un source distribution
, dans notre dossier racine de projet, nous appelons notre setup.py
depuis la ligne de commande, en spécifiant que nous voulons sdist
:
python setup.py sdist
Cela créera notre package de distribution et les informations sur les œufs, et aboutira à une structure de dossiers comme celle-ci, avec notre package dans dist
:
.
├── dist/
├── hellostackoverflow.egg-info/
├── LICENCE.txt
├── README.rst
├── setup.py
└── hellostackoverflow/
├── __init__.py
└── hellostackoverflow.py
À ce stade, nous avons un package que nous pouvons installer à l'aide pip
de notre racine de projet (en supposant que vous avez tous les noms comme dans cet exemple):
pip install ./dist/hellostackoverflow-0.0.1.tar.gz
Si tout se passe bien, nous pouvons maintenant ouvrir un interpréteur Python, je dirais quelque part en dehors de notre répertoire de projet pour éviter toute confusion, et essayer d'utiliser notre nouveau package brillant:
Python 3.5.2 (default, Sep 14 2017, 22:51:06)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from hellostackoverflow import hellostackoverflow
>>> hellostackoverflow.greeting()
'Hello Stack Overflow!'
Maintenant que nous avons confirmé l'installation et le fonctionnement du package, nous pouvons le télécharger sur PyPI.
Comme nous ne voulons pas polluer le référentiel en direct avec nos expériences, nous créons un compte pour le référentiel de test et installons twine
pour le processus de téléchargement:
pip install twine
Maintenant que nous y sommes presque, avec notre compte créé, nous disons simplement twine
de télécharger notre package, il demandera nos informations d'identification et téléchargera notre package dans le référentiel spécifié:
twine upload --repository-url https://test.pypi.org/legacy/ dist/*
Nous pouvons maintenant nous connecter à notre compte sur le référentiel de test PyPI et nous émerveiller de notre package fraîchement téléchargé pendant un certain temps, puis le saisir en utilisant pip
:
pip install --index-url https://test.pypi.org/simple/ hellostackoverflow
Comme nous pouvons le voir, le processus de base n'est pas très compliqué. Comme je l'ai dit plus tôt, il y a beaucoup plus que couvert ici, alors allez-y et lisez le tutoriel pour une explication plus approfondie.