J'ai pensé que ce serait bien de créer une application de ligne de commande en Python pour apprendre les techniques autour des actions setup.py, argparse et GitHub, alors je l'ai essayé. Nous n'expliquerons pas chaque technologie en détail ici, veuillez donc vous référer aux documents officiels et aux articles de commentaires présentés dans l'article.
J'ai créé To-Do List App. Toutefois
todo add "Hoge"
todo complete "Hoge"
todo remove "Hoge"
Il vous suffit d'ajouter, de compléter et de supprimer des tâches. Aussi,
todo complete --all
todo remove -a
Vous pouvez tout compléter ou tout supprimer avec. La liste des tâches est stockée dans ~ / .todo.json
et
$ todo show
□ Hoge
☑ Hogehoge
Il peut être affiché sous la forme.
Utilisez argparse pour définir la gestion des arguments de ligne de commande.
argparse a trop de fonctions à saisir, mais cette fois j'ai utilisé ce qui suit. Le code entier est ici.
parser = argparse.ArgumentParser()
#Quelque chose comme commit ou run tel que git commit ou docker run
#Est nommé comme sous-commande et ajouté
parser.add_argument('subcommand', help='add, complete, or remove')
#Soit content l'argument qui vient après la sous-commande.
#nargs est le nombre d'arguments, l'un est nargs=1
# nagrgs='*'Se traduira par un argument de longueur variable de 0 ou plus
# nargs='+'Est un argument de longueur variable de 1 ou plus
# nargs='?'Est 0 ou 1
# https://docs.python.org/ja/3/library/argparse.html#nargs
parser.add_argument('content', help='Content of To-Do', nargs='?')
# --toutes les options(Forme raccourcie-a)Ajouter
#C'est un drapeau, pas une option qui prend un argument`store_true=True`Spécifier
parser.add_argument('-a', '--all', action='store_true', help='remove or complete all To-Dos')
Si la sous-commande est «show» ou «remove --all», l'argument «contenu» n'est pas nécessaire, mais il peut être spécifié. Je ne savais pas comment l'écrire dans argparse pour qu'il ne puisse pas être spécifié, donc même si un argument est spécifié, il est ignoré en interne.
Vous pouvez l'utiliser pour appeler le processus en fonction de l'argument spécifié (car il n'y a aucune connaissance notable sur le processus, code source Voir sample / blob / master / src / todo / main.py)).
Écrivez setup.py
pour que l'application de ligne de commande soit installée automatiquement.
Le setup.py
écrit peut être trouvé à ici (écrit en [pip](https: /) /github.com/pypa/pip/blob/master/setup.py) et numpy Cependant, je pense que les parties suivantes sont importantes à cet égard.
entry_points={
"console_scripts": [
"todo=todo.main:main"
]
},
Cela installera la commande dans votre OS PATH lorsque vous effectuez python3 setup.py install
. Dans mon environnement, cela ressemble à ceci [^ 3].
$ which todo
/home/linuxbrew/.linuxbrew/bin/todo
$ cat $(which todo)
#!/home/linuxbrew/.linuxbrew/opt/python/bin/python3.7
# EASY-INSTALL-ENTRY-SCRIPT: 'todo==0.1.0','console_scripts','todo'
__requires__ = 'todo==0.1.0'
import re
import sys
from pkg_resources import load_entry_point
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
sys.exit(
load_entry_point('todo==0.1.0', 'console_scripts', 'todo')()
)
Maintenant, quel que soit le répertoire dans lequel vous vous trouvez, appuyez sur todo dans le terminal pour appeler une fonction appelée main dans le module principal du package todo pour faire ce que vous avez écrit.
[^ 3]: J'utilise Python que j'ai mis dans Linuxbrew.
Je l'ai installé en exécutant setup.py
plus tôt, mais vous pouvez également l'installer à partir du référentiel Git en utilisant pip comme suit. S'il s'agit d'une commande ou d'un package à usage général, c'est une bonne idée de l'enregistrer dans PyPI.
pip3 install git+https://github.com/pn11/python-command-line-sample
Avant de le savoir, [^ 1] je voulais utiliser les actions qui ont été ajoutées à GitHub, ce qui a été la raison pour laquelle cet article [^ 2]. Cette fois, je vais effectuer un test automatique en toute sécurité.
[^ 1]: [Dernières nouvelles] Les actions GitHub sont désormais officielles. Exécutez build / test / deploy etc. dans GitHub et réalisez CI / CD. GitHub Universe 2019-Publickey [^ 2]: C'est incroyable que de nouvelles fonctionnalités aient été ajoutées de plus en plus depuis son acquisition par MS. ..
Pour le moment, écrivez un putain de test qui supprime simplement toutes les listes de tâches, puis les ajoute. J'ai fait.
import todo.main
def test_add():
todo.main._remove_todo('', all_flag=True)
todo.main._add_todo('foo')
dic = todo.main._load_todos()
assert dic['foo'] == 'Not Yet'
Je voudrais faire cela avec le nez en utilisant les actions GitHub.
Si vous allez dans l'onglet Actions du référentiel, vous verrez un écran comme celui ci-dessous, alors essayons-le avec Python package
pour le moment.
L'écran suivant apparaîtra, donc pour le moment, appuyez sur Start Commit
sans penser à rien.
Le test échoue.
En regardant YAML, cela ressemble à ceci:
name: Python package
on: [push]
jobs:
build:
runs-on: ubuntu-latest
strategy:
max-parallel: 4
matrix:
python-version: [2.7, 3.5, 3.6, 3.7]
steps:
- uses: actions/checkout@v1
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v1
with:
python-version: ${{ matrix.python-version }}
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
- name: Lint with flake8
run: |
pip install flake8
# stop the build if there are Python syntax errors or undefined names
flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics
# exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide
flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics
- name: Test with pytest
run: |
pip install pytest
pytest
D'une manière ou d'une autre, sous étapes:
- name:Choses à faire
run: |
Commande 1
Commande 2
Cela semble bon de jouer avec quelque chose comme ça. Donc, j'ai écrit le processus suivant.
- name: Install Package
run: |
python setup.py install
- name: Test with nose
run: |
pip install nose
nosetests
Après avoir installé le paquet To-Do avec setup.py
, installez également nose et exécutez le test.
Lorsque j'ai commis cela, le test a réussi. Je n'étais pas particulièrement conscient du répertoire d'exécution, mais il semble être exécuté à la racine du référentiel. De plus, j'ai utilisé le nez d'une manière ou d'une autre, mais comme il ne s'agit pas d'un test dépendant de la bibliothèque, pytest devrait-il fonctionner tel quel?
Désormais, le test s'exécutera à chaque fois que vous vous engagez. Si vous réussissez le test, il semble bon avec la marque: white_check_mark:.
Jusqu'à présent, j'ai essayé de créer des commandes avec argparse, l'empaquetage avec setup.py et des tests automatisés avec des actions GitHub. À l'avenir, j'aimerais produire en masse des commandes putain en utilisant cette méthode.
Bien que cela ne soit pas couvert dans cet article, il peut être bon d'utiliser click etc. en plus de argparse lors de la création d'outils de ligne de commande.
Recommended Posts