J'essaierai de créer une structure de répertoires Python que je ne regretterai pas plus tard

Cela fait un moment que j'ai commencé à programmer avec Python, et j'ai compris la structure des répertoires, je vais donc la résumer. Au début, je ne le comprenais pas du tout, et j'étais beaucoup recherché sur Google, alors je l'ai écrit par étapes pour que même les débutants puissent le comprendre.

Ce qui suit est un mémo d'un ingénieur qui développe avec Python depuis environ six mois. ** Nous vous serions reconnaissants de bien vouloir nous donner de nombreuses suggestions et suggestions pour de meilleures méthodes, ainsi que des questions de débutants. ** **

introduction

Quand j'ai touché Python pour la première fois, j'ai écrit beaucoup de méthodes dans hoge.py pour le moment, et finalement il y avait plusieurs fichiers et plus de répertoires. Cependant, lorsque j'ai fait cela, je n'ai pas réussi à résoudre les dépendances dans mon propre programme, et la structure est devenue de plus en plus incompréhensible, et j'ai senti qu'il était difficile de la corriger plus tard.

Par conséquent, à moins qu'il s'agisse d'une programmation très urgente, je pense qu'il est important de commencer ** "préparer les répertoires et les fichiers pour qu'ils puissent être facilement transformés en bibliothèque" **. Je vais créer le modèle dans cet article.

Tout d'abord, écrivez à partir de setup.py

Tout d'abord, créez un répertoire python_package comme dossier de projet et créez un nouveau setup.py. La zone directement sous le projet est, bien sûr, comme indiqué ci-dessous.

.
└── setup.py

** setup.py est absolument nécessaire lorsque vous fournissez votre propre programme en tant que bibliothèque. ** **

Pour le moment, remplissons ce qui peut être mis actuellement. Vous décidez du nom du projet que vous essayez de créer et de l'emplacement de la source.

setup.py


from setuptools import setup

setup(
    name="koboripackage",
    version='1.0',
    description='Pour tester la structure de répertoires Python',
    author='Kobori Akira',
    author_email='[email protected]',
    url='https://github.com/koboriakira/python_package',
)

Si le produit à créer est clair, vous pouvez créer README.md à ce stade.

J'essaierai d'en faire une bibliothèque pour le moment

Après avoir écrit setup.py, l'étape suivante consiste à préparer le répertoire source.

Créez un répertoire avec le même nom que celui que vous avez écrit dans nom de l'installation, et mettez-y \ _ \ _ init \ _ \ _.py pour le moment. Un fichier vide est OK. Créez également un fichier Python avec le même nom de fichier que le nom du répertoire. Disons que c'est un module qui est utilisé comme bibliothèque.

.
├── koboripackage
│   ├── __init__.py
│   └── koboripackage.py
└── setup.py

koboripackage.py


def hello(name):
    print('Hello, %s!' % name)

Lorsque la création est terminée, exécutez python setup.py sdist dans le répertoire contenant setup.py.

$ python setup.py sdist
running sdist
running egg_info
.
.
.
creating dist
Creating tar archive
removing 'koboripackage-1.0' (and everything under it)

Ensuite, le nombre de fichiers a augmenté de diverses manières.

.
├── dist
│   └── koboripackage-1.0.tar.gz
├── koboripackage
│   ├── __init__.py
│   └── koboripackage.py
├── koboripackage.egg-info
│   ├── PKG-INFO
│   ├── SOURCES.txt
│   ├── dependency_links.txt
│   └── top_level.txt
└── setup.py

Parmi ceux-ci, le tar contenu dans dist est une bibliothèque que tout le monde peut utiliser avec pip install. Nous n'avons pas encore publié la bibliothèque, donc pour l'instant spécifions ce tar directement et mettons-le localement.

pip install dist/koboripackage-1.0.tar.gz

Voyons s'il peut réellement être utilisé comme bibliothèque. Exécutez Python dans la CLI.

$ python
>>> from koboripackage import koboripackage
>>> koboripackage.hello('World')
Hello, World!
>>> 

De cette façon, j'ai pu importer et utiliser les modules et fonctions que j'ai créés. Vous pouvez désinstaller la bibliothèque avec pip uninstall koboripackage.

Rendez-le disponible dans CLI

Les bibliothèques créées en Python peuvent également être exécutées à partir du terminal sur la ligne de commande.

Ajoutons un paramètre pour cela. Tout d'abord, créez cli.py directement sous le répertoire source.

cli.py


def execute():
    print('La commande a été exécutée!')

Puis modifiez setup.py.

  1. Définissez version sur 1.1
  2. Ajoutez find_packages pour importer et ajouter packages = find_packages ()
  3. Ajoutez ʻentry_points. Le format est écrit avec command name = module: method`

setup.py


from setuptools import setup, find_packages

setup(
    name="koboripackage",
    version='1.1',
    description='Pour tester la structure de répertoires Python',
    author='Kobori Akira',
    author_email='[email protected]',
    url='https://github.com/koboriakira/python_package',
    packages=find_packages(),
    entry_points="""
      [console_scripts]
      koboripackage = koboripackage.cli:execute
    """,
)

Exécutez à nouveau python setup.py sdist lorsque vous avez terminé. Ensuite, un nouveau tar v1.1 est créé dans dist, et la configuration est la suivante.

.
├── dist
│   ├── koboripackage-1.0.tar.gz
│   └── koboripackage-1.1.tar.gz
├── find_package.txt
├── koboripackage
│   ├── __init__.py
│   ├── cli.py
│   └── koboripackage.py
├── koboripackage.egg-info
└── setup.py

Comme précédemment, essayez d'installer la bibliothèque avec pip install dist / koboripackage-1.1.tar.gz. Puis

$ koboripackage
La commande a été exécutée!

Comme mentionné ci-dessus, vous pouvez voir que la méthode execute de cli.py ne peut être exécutée que par le nom de la commande.

(Supplément) À propos de \ _ \ _ init \ _ \ _. Py et find_packages ()

C'est peut-être faux, mais j'écrirai ma compréhension.

find_packages () est une méthode pour trouver la source dont vous avez besoin lors de la création de tar avec python setup.py sdist. Et vous aurez besoin de «__init __. Py» pour la recherche.

Ce n'est que dans ce chapitre que nous ajouterons le sous-répertoire et sub_module.py au répertoire source.

.
├── koboripackage
│   ├── __init__.py
│   ├── cli.py
│   ├── koboripackage.py
│   └── sub
│       ├── __init__.py
│       └── sub_module.py
├── setup.py

À ce stade, s'il n'y a pas de \ _ \ _ init \ _ \ _. Py dans le sous-répertoire, find_packages () ne trouvera pas les fichiers dans et dans le sous-répertoire.

Vous pouvez vérifier quel fichier vous trouvez = emballé dans SOURCES.txt dans egg-info.

$ cat koboripackage.egg-info/SOURCES.txt 
MANIFEST.in
requirements.txt
setup.py
koboripackage/__init__.py
koboripackage/cli.py
koboripackage/koboripackage.py
koboripackage.egg-info/PKG-INFO
koboripackage.egg-info/SOURCES.txt
koboripackage.egg-info/dependency_links.txt
koboripackage.egg-info/entry_points.txt
koboripackage.egg-info/requires.txt
koboripackage.egg-info/top_level.txt
koboripackage/sub/__init__.py
koboripackage/sub/sub_module.py
tests/__init__.py

Utilisation de la bibliothèque existante

Essayez d'importer une bibliothèque existante dans cli.py.

cli.py


import requests


def execute():
    print('La commande a été exécutée!')
    response = requests.get('https://www.google.com/')
    print(response.status_code)

Pour utiliser les requêtes (localement), vous devez importer la bibliothèque avec pip install requests. De même, lorsque vous la fournissez en tant que bibliothèque, il est nécessaire de spécifier "ce qui doit être importé".

Préparez requirements.txt pour cela. Placez-le directement sous le projet.

requirements.txt


requests==2.23.0

En passant, vous pouvez vérifier la bibliothèque et la version requises avec la commande pip freeze. Cependant, toutes les bibliothèques actuellement installées sont sorties, donc si vous copiez et collez telles quelles, vous pouvez inclure des bibliothèques inutiles.

Ensuite, définissez deux paramètres pour que requirements.txt soit utilisé correctement lors de la création de tar avec python setup.py sdist.

  1. Créez un nouveau MANIFEST.in
  2. Ajoutez ʻinstall_requires` à setup.py (et à la version 1.2)
.
├── MANIFEST.in
├── dist
├── koboripackage
│   ├── __init__.py
│   ├── cli.py
│   └── koboripackage.py
├── koboripackage.egg-info
├── requirements.txt
└── setup.py

MANIFEST.in


include requirements.txt

setup.py


from setuptools import setup, find_packages

setup(
    name="koboripackage",
    version='1.2',
    description='Pour tester la structure de répertoires Python',
    author='Kobori Akira',
    author_email='[email protected]',
    url='https://github.com/koboriakira/python_package',
    packages=find_packages(),
    entry_points="""
      [console_scripts]
      koboripackage = koboripackage.cli:execute
    """,
    install_requires=open('requirements.txt').read().splitlines(),
)

** MANIFEST.in peut "ajouter quelque chose qui n'est normalement pas inclus lorsqu'il est emballé (et vice versa)" **. Puisque nous avons écrit ʻinclude requirements.txt`, nous ajouterons requirements.txt lors de l'empaquetage.

Ensuite, dans ʻinstall_requires` ajouté à l'installation, spécifiez la bibliothèque requise. Vous pouvez spécifier le nom de la bibliothèque directement sous forme de tableau, mais il semble qu'il soit courant de lire le contenu de requirements.txt comme décrit ci-dessus.

install_requires=['requests']

Lorsque vous avez terminé, créez un tar v1.2 avec un fichier avec python setup.py sdist. Lorsque j'exécute la commande après avoir installé la nouvelle version de la bibliothèque avec pip install dist / koboripackage-1.2.tar.gz,

$ koboripackage
La commande a été exécutée!
200

Vous pouvez voir que la bibliothèque est disponible comme ci-dessus.

Télécharger vers PyPi

Si vous vous êtes préparé jusqu'à présent, vous pouvez vous inscrire dans PyPi (Python Package Index). Veuillez consulter https://blog.amedama.jp/entry/2017/12/31/175036 pour la procédure spécifique. Si vous pouvez le télécharger avec succès, vous pouvez l'installer avec pip install koboripackage.

Préparer des tests

Soyez prêt pour les tests.

Créez un dossier de tests directement sous le projet. Créez un fichier Python de test avec la même structure que le répertoire contenant la source (ajoutez test au préfixe). N'oubliez pas \ _ \ _ init \ _ \ _. Py.

.
├── MANIFEST.in
├── dist
├── koboripackage
│   ├── __init__.py
│   ├── cli.py
│   └── koboripackage.py
├── koboripackage.egg-info
├── requirements.txt
├── setup.py
└── tests
    ├── __init__.py
    └── test_koboripackage.py

Écrivez la source comme suit pour koboripackage.py et test_koboripackage.py pour vérifier le comportement de multiplier ().

koboripackage.py


def hello(name):
    print('Hello, %s!' % name)


def multiply(a, b):
    return a * b

test_koboripackage.py


from koboripackage import koboripackage


def test_multiply():
    assert koboripackage.multiply(2, 3) == 6

Installez pytest avec pip install pytest, puis exécutez pytest.

$ pytest
================================================================================================== test session starts ==================================================================================================
platform darwin -- Python 3.8.2, pytest-5.4.1, py-1.8.1, pluggy-0.13.1
rootdir: ...............
collected 1 item                                                                                                                                                                                                        

tests/test_koboripackage.py .                                                                                                                                                                                     [100%]

=================================================================================================== 1 passed in 0.02s ===================================================================================================

Vous venez de créer un projet Python général.

Préparer Docker et git

Enfin, je préparerai une image Docker car c'est un gros problème. Après avoir ajouté les fichiers nécessaires, créez une image avec la bibliothèque installée à l'avance.

FROM python:3.7.5-slim

WORKDIR /work

ADD koboripackage koboripackage
ADD tests tests
ADD requirements.txt requirements.txt
ADD setup.py setup.py
ADD MANIFEST.in MANIFEST.in

RUN pip install --upgrade pip \
  && pip install -r requirements.txt \
  && pip install pytest

CMD bash

Créez une image avec docker build -t python_package . et créez un conteneur avec docker run -it --rm python_package. Vous pouvez maintenant exécuter pytest dans un conteneur Docker. Si vous souhaitez le développer tel quel, vous pouvez partager la source comme suit.

docker run -it --rm -v $(pwd)/koboripackage:/work/koboripackage -v $(pwd)/tests:/work/tests  python_package

Enfin, poussez ceci vers github. Certains des fichiers créés au cours de ce processus n'ont pas besoin d'être téléchargés sur github, alors préparez .gitignore.

.gitignore


**/__pycache__
dist/
koboripackage.egg-info/

à la fin

Le package créé de cette manière est le suivant. Je l'ai également téléchargé sur Ichiou PyPi. https://github.com/koboriakira/python_package

À l'origine, j'écrivais la licence dans setup.py, mais je n'avais pas la confiance nécessaire pour entrer, donc je l'ai évité cette fois. À l'heure actuelle, nous ne sommes conscients que de "je me demande si ce devrait être le MIT pour le moment".

En préparant un état qui peut être transformé en bibliothèque de cette manière dès le début, j'espère qu'il sera plus facile de créer consciemment des composants de taille appropriée.

référence

Recommended Posts

J'essaierai de créer une structure de répertoires Python que je ne regretterai pas plus tard
Créer un répertoire avec python
Créons un script qui s'enregistre avec Ideone.com en Python.
Créons un environnement virtuel pour Python
Créons un groupe gratuit avec Python
[Python] Créez un LineBot qui s'exécute régulièrement
Créons une base de données clients où le code QR est automatiquement émis en Python
Créer une page qui se charge indéfiniment avec python
Python: créer une classe qui prend en charge l'affectation décompressée
python Création de fonctions dont on pourra se souvenir plus tard
Créez un plugin qui vous permet de rechercher les onglets Sublime Text 3 en Python
Créer un module Python
En Python, créez un décorateur qui accepte dynamiquement les arguments Créer un décorateur
Créer un environnement Python
[Python] Créez un linebot qui dessine n'importe quelle date sur une photo
Créons un diagramme PRML avec Python, Numpy et matplotlib.
J'ai fait une putain d'application qui ne te laisse pas sauter
Créons un environnement Docker qui stocke les informations de tendance Qiita!
Créer un dictionnaire en Python
Créer un tableau numpy python
[Python / Django] Créer une API Web qui répond au format JSON
[Ev3dev] Créez un programme qui capture LCD (écran) en utilisant python
[LINE Messaging API] Créez un BOT qui se connecte à quelqu'un avec Python
Créer une interface graphique python à l'aide de tkinter
Créer un conteneur DI avec Python
Avez-vous besoin de Python re.compile?
Créez un environnement virtuel avec Python!
Créer un fichier binaire en Python
création du répertoire python Correspondance si le répertoire existe
Créer un environnement python dans centos
Créer un framework de décorateur à usage général pour Python
Faisons un graphe avec python! !!
5 façons de créer un chatbot Python
Créer une chaîne aléatoire en Python
Notez que l'environnement Python de Pineapple peut être modifié avec pyenv
Conseils (structure de contrôle) à connaître lors de la programmation de la compétition avec Python2
Conseils (structure de données) à connaître lors de la programmation de compétitions avec Python2