Un moyen standard de développer et de distribuer des packages en Python

Je ne connaissais pas la manière standard de développer et de distribuer des packages en Python, alors j'ai cherché. La poésie est plus facile, mais il est utile de se rappeler de travailler sur un projet créé par l'homme.

Créer un environnement virtuel

Commencez avec le dernier Python, tel que Python 3.7.7, prêt à être exécuté avec des commandes python. Afin de développer un package à partir de maintenant, créez d'abord un environnement virtuel afin que les autres programmes et bibliothèques Python utilisés ne soient pas mélangés. La manière standard de créer un environnement virtuel est d'utiliser le module venv https://docs.python.org/ja/3/tutorial/venv.html. Il n'y a pas d'emplacement fixe pour l'environnement virtuel, mais le dossier .venv est souvent utilisé.

mkdir packaging_tutorial
cd packaging_tutorial
python -m venv .venv
source .venv/bin/activate

Le dernier source .venv / bin / activate est la commande pour entrer dans l'environnement. Tapez simplement «désactiver» pour quitter.

Installation des bibliothèques utilisées pour le développement (peut ne pas être nécessaire)

Écrivez la bibliothèque utilisée pour le développement dans un fichier appelé requirements.txt. Ici, nous utilisons un package appelé requêtes.

requests ~= 2.23.0

Pour installer le package décrit dans requirements.txt, utilisez la commande suivante.

pip install -r requirements.txt 

Cela installera les bibliothèques requises dans un environnement virtuel valide .venv. Si vous avez déjà fait beaucoup de pip install et que vous avez oublié ce que vous avez mis

pip freeze > requirements.txt

Vous pouvez créer requirements.txt à partir de l'environnement actuel comme ceci.

Mettre en œuvre le package

Cette fois, nous utiliserons la structure de répertoires suivante.

packaging_tutorial/
  corona/
    __init__.py
    __main__.py
  tests/
  requirements.txt
  setup.py
  LICENSE
  README.md

Voici un exemple de corona / __ init __. Py. J'ai implémenté la fonction get () pour obtenir des informations sur la nouvelle corona qui est populaire ces jours-ci. Préparez également main () pour qu'il puisse être facilement exécuté à partir de la ligne de commande.

import requests
import sys

def get(country: str) -> str:
    url = f"https://corona-stats.online/{country}?minimal=true"
    response = requests.get(url, headers={'user-agent': 'curl'})
    return response.text

def main() -> None:
    country = sys.argv[1] if len(sys.argv) > 1 else ""
    print(get(country))

Écrivez corona / __ main __. Py pour appeler main () avec pythonm -m.

from . import main
main()

Essaye le.

% python -m corona jp
Rank Country    Total Cases  New Cases ▲ Total Deaths New Deaths ▲ Recovered Active  Critical Cases / 1M pop
1    Japan (JP)        2,495                       62                    472   1,961       60             20
     World         1,015,466       523 ▲       53,190         24 ▲   212,229 750,047   37,696         130.29

Écrivez setup.py pour terminer le package.

Créez un fichier appelé setup.py et écrivez les informations sur le package. Les spécifications détaillées peuvent être trouvées sur https://packaging.python.org/guides/distributing-packages-using-setuptools/. Comme un point

import setuptools

with open("README.md", "r") as fh:
    long_description = fh.read()

setuptools.setup(
    name="corona-propella", # Replace with your own username
    version="0.0.1",
    install_requires=[
        "requests",
    ],
    entry_points={
        'console_scripts': [
            'corona=corona:main',
        ],
    },
    author="Propella",
    author_email="[email protected]",
    description="A covoid-19 tracker",
    long_description=long_description,
    long_description_content_type="text/markdown",
    url="https://github.com/pypa/sampleproject",
    packages=setuptools.find_packages(),
    classifiers=[
        "Programming Language :: Python :: 3",
        "License :: OSI Approved :: MIT License",
        "Operating System :: OS Independent",
    ],
    python_requires='>=3.7',
)

Maintenant que le package est complet, installez-le dans cet environnement et exécutez-le.

pip install -e .
rehash
corona

Cette commande pip install -e installe le paquet en mode développement, ce qui est utile dès que vous changez le code source.

Faites un document

Je vais résumer le paquet que j'ai fait pour que je puisse le distribuer. Le format standard est la roue. Installez les commandes requises et créez un fichier whl dans dist.

pip install --upgrade pip setuptools wheel
python setup.py bdist_wheel

Un fichier comme dist / corona_propella-0.0.1-py3-none-any.whl est la distribution. Vous pouvez l'installer avec pip.

Tester le document

Créons un autre environnement virtuel et testons la distribution.

deactivate
cd ..
mkdir packaging_test
cd packaging_test
python -m venv .venv
source .venv/bin/activate
pip install ../packaging_tutorial/dist/corona_propella-0.0.1-py3-none-any.whl
python -m corona jp

Cela installera le package que vous venez de créer avec les packages dépendants dans votre environnement virtuel. Lisse. .. ..

Créer un œuf

Au lieu de Wheel, vous pouvez créer un format appelé Egg qui semble avoir été utilisé dans le passé.

python setup.py bdist_egg

Utilisez easy_install au lieu de pip pour installer Egg.

easy_install ../packaging_tutorial/dist/corona_propella-0.0.1-py3.7.egg

Divers nettoyage

Supprimer le fichier créé par setup.py

python setup.py clean --all

Effacer l'environnement virtuel

rm -r .venv

Relation entre requirements.txt et setup.py

La méthode que j'ai introduite est fastidieuse car vous finissez par écrire les packages requis à la fois dans requirements.txt et install_requires dans setup.py. Selon https://caremad.io/posts/2013/07/setup-vs-requirement/, il existe les différences de manières suivantes.

Lors de la création d'une bibliothèque, pip install -e . installera également les packages dépendants, donc je ne pense pas que vous ayez besoin de requirements.txt.

référence

Recommended Posts

Un moyen standard de développer et de distribuer des packages en Python
Organisez les modules et les packages Python dans le désordre
Étapes pour développer une application Web en Python
Comment développer en Python
Paquets qui gèrent le MIDI avec Python midi et pretty_midi
Changer la destination de sortie standard en un fichier en Python
Un moyen simple d'éviter plusieurs boucles for en Python
Comment développer dans un environnement virtuel Python [Memo]
Introduction d'une bonne méthode de gestion des connexions DB en Python
[Mac] Un moyen très simple d'exécuter des commandes système en Python et de générer les résultats
Essayez simplement de recevoir un webhook avec ngrok et Python
Recherche d'un moyen unifié d'attendre et d'obtenir les changements d'état de Selenium pour les éléments Python
Un moyen simple de visualiser le temps pris en Python et un moyen plus intelligent de l'améliorer
Comment afficher les octets de la même manière en Java et Python
Comment empaqueter et distribuer des scripts Python
Les modules et packages en Python sont des "espaces de noms"
Comment obtenir stacktrace en python
Un moyen simple d'utiliser Wikipedia avec Python
Gérer les packages python à installer dans des conteneurs
Comment utiliser is et == en Python
[Python] Comment mettre n'importe quel nombre d'entrées standard dans la liste
Comment mettre un espace demi-largeur avant les lettres et les chiffres en Python.
Connectez-vous à postgreSQL depuis Python et utilisez des procédures stockées dans une boucle.
J'ai essayé de développer un formateur qui génère des journaux Python en JSON
Comment arrêter le programme jusqu'à une date et une heure spécifiques en python
Calculons en fait le problème statistique avec Python
Comment générer une séquence en Python et C ++
Comment incorporer des variables dans des chaînes python
Je veux créer une fenêtre avec Python
Créer un graphique de distribution normale standard en Python
Comment créer un fichier JSON en Python
J'ai écrit une classe en Python3 et Java
Envoyer un message à Skype et Chatwork en Python
Pour ajouter un module à python que vous mettez dans Julialang
Comment notifier les canaux Discord en Python
[Python] Comment dessiner un histogramme avec Matplotlib
Comment générer "Ketsumaimo" en standard en Python
Pour représenter la date, l'heure, l'heure et les secondes en Python
Comment tracer l'autocorrélation et l'autocorrélation partielle avec Python
Utilisez libsixel pour générer Sixel en Python et générer le graphe Matplotlib vers le terminal.
Je veux exécuter et distribuer un programme qui redimensionne les images Python3 + pyinstaller
Recherche d'un moyen efficace d'écrire un Dockerfile avec Python avec de la poésie
Paquets et modules Python
Convertir la date et l'heure zonées en temps Unixtime dans Python2.7
J'ai essayé de représenter graphiquement les packages installés en Python
Analyser une chaîne JSON écrite dans un fichier en Python
Comment convertir / restaurer une chaîne avec [] en python
Je souhaite intégrer une variable dans une chaîne Python
Je veux facilement implémenter le délai d'expiration en python
Calcul de l'écart type et du coefficient de corrélation en Python
(Python) Essayez de développer une application Web en utilisant Django
Je veux écrire en Python! (2) Écrivons un test
[Python] Comment développer des variables dans une chaîne de caractères
J'ai essayé d'implémenter un pseudo pachislot en Python
Créez un plug-in pour exécuter Python Doctest avec Vim (1)
Un mémorandum pour exécuter un script python dans un fichier bat