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. ** **
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, 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.
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
.
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.
version
sur 1.1find_packages
pour importer et ajouter packages = find_packages ()
. 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.
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
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
.
.
├── 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.
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
.
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.
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/
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.