Ich dachte, es wäre schön, eine Befehlszeilen-App in Python zu erstellen, um die Techniken rund um setup.py, argparse und GitHub Actions zu lernen, also habe ich es versucht. Wir werden hier nicht jede Technologie im Detail erklären. Lesen Sie daher bitte die offiziellen Dokumente und Kommentarartikel, die im Artikel vorgestellt werden.
Ich habe [To-Do List App] erstellt (https://github.com/pn11/python-command-line-sample). Sogar so
todo add "Hoge"
todo complete "Hoge"
todo remove "Hoge"
Fügen Sie einfach Aufgaben hinzu, vervollständigen Sie sie und löschen Sie sie. Ebenfalls,
todo complete --all
todo remove -a
Sie können alles mit vervollständigen oder löschen. Die Aufgabenliste wird in ~ / .todo.json
und gespeichert
$ todo show
□ Hoge
☑ Hogehoge
Es kann angezeigt werden als.
Verwenden Sie argparse, um die Behandlung von Befehlszeilenargumenten zu definieren.
argparse hat zu viele Funktionen, um sie zu erfassen, aber diesmal habe ich Folgendes verwendet. Der gesamte Code ist hier.
parser = argparse.ArgumentParser()
#So etwas wie Commit oder Run wie Git Commit oder Docker Run
#Wird als Unterbefehl benannt und hinzugefügt
parser.add_argument('subcommand', help='add, complete, or remove')
#Der Inhalt sei das Argument, das nach dem Unterbefehl steht.
#nargs ist die Anzahl der Argumente, eines ist nargs=1
# nagrgs='*'Führt zu einem Argument mit variabler Länge von 0 oder mehr
# nargs='+'Ist ein Argument variabler Länge von 1 oder mehr
# nargs='?'Ist 0 oder 1
# https://docs.python.org/ja/3/library/argparse.html#nargs
parser.add_argument('content', help='Content of To-Do', nargs='?')
# --alle Option(Kurzform-a)Hinzufügen
#Es ist eine Flagge, keine Option, die ein Argument akzeptiert`store_true=True`Angeben
parser.add_argument('-a', '--all', action='store_true', help='remove or complete all To-Dos')
Beachten Sie, dass das Argument "Inhalt" nicht erforderlich ist, wenn der Unterbefehl "show" lautet oder wenn "remove --all" verwendet wird, es kann jedoch angegeben werden. Ich wusste nicht, wie ich es in argparse schreiben sollte, damit es nicht angegeben werden konnte. Selbst wenn ein Argument angegeben wird, wird es intern ignoriert.
Sie können dies verwenden, um den Prozess gemäß dem angegebenen Argument aufzurufen (da es keine nennenswerten Kenntnisse über den Prozess gibt, Quellcode Siehe Beispiel / blob / master / src / todo / main.py)).
Schreiben Sie setup.py
, damit die Befehlszeilen-App automatisch installiert wird.
Die geschriebene setup.py
finden Sie unter hier (geschrieben in [pip](https: /) /github.com/pypa/pip/blob/master/setup.py) und numpy Ich denke jedoch, dass die folgenden Teile dabei wichtig sind.
entry_points={
"console_scripts": [
"todo=todo.main:main"
]
},
Dadurch wird der Befehl in Ihrem Betriebssystempfad installiert, wenn Sie "python3 setup.py install" ausführen. In meiner Umgebung sieht es so aus [^ 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')()
)
Unabhängig davon, in welchem Verzeichnis Sie sich befinden, ruft das Drücken von todo im Terminal eine Funktion namens main im Hauptmodul des todo-Pakets auf, um das zu tun, was Sie schreiben.
[^ 3]: Ich verwende Python, das ich in Linuxbrew eingefügt habe.
Ich habe es installiert, indem ich setup.py
früher ausgeführt habe, aber Sie können es auch wie folgt aus dem Git-Repository mit pip installieren. Wenn es sich um einen Allzweckbefehl oder ein Allzweckpaket handelt, empfiehlt es sich, es in PyPI zu registrieren.
pip3 install git+https://github.com/pn11/python-command-line-sample
Bevor ich es wusste, [^ 1] wollte ich Aktionen verwenden, die zu GitHub hinzugefügt wurden, was der Grund für das Schreiben dieses Artikels war [^ 2]. Dieses Mal werde ich sicher einen automatischen Test durchführen.
[^ 1]: [Aktuelle Nachrichten] GitHub Actions ist jetzt offiziell. Führen Sie Build / Test / Deployment usw. in GitHub aus und realisieren Sie CI / CD. GitHub Universe 2019-Publickey [^ 2]: Es ist erstaunlich, dass seit der Übernahme durch MS immer mehr neue Funktionen hinzugefügt wurden. ..
Schreiben Sie vorerst einen verdammten Test, der nur die gesamte ToDo-Liste löscht und dann hinzufügt. Ich tat.
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'
Ich möchte dies mit der Nase mit GitHub-Aktionen tun.
Wenn Sie zur Registerkarte "Aktionen" des Repositorys gehen, wird ein Bildschirm wie der folgende angezeigt. Versuchen wir es also zunächst mit "Python-Paket".
Der Bildschirm sieht wie folgt aus. Drücken Sie einfach "Start Commit", ohne an etwas zu denken.
Der Test schlägt fehl.
Bei YAML sieht es so aus:
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
Irgendwie unter "Schritte:"
- name:Dinge die zu tun sind
run: |
Befehl 1
Befehl 2
Es scheint gut, mit so etwas zu spielen. Also schrieb ich den folgenden Prozess.
- name: Install Package
run: |
python setup.py install
- name: Test with nose
run: |
pip install nose
nosetests
Installieren Sie nach der Installation des To-Do-Pakets mit "setup.py" auch die Nase und führen Sie den Test aus.
Als ich dies festschrieb, wurde der Test erfolgreich bestanden. Das Ausführungsverzeichnis war mir nicht besonders bekannt, aber es scheint im Stammverzeichnis des Repositorys zu laufen. Ich habe auch irgendwie die Nase benutzt, aber da es sich nicht um einen bibliotheksabhängigen Test handelt, sollte er mit pytest so funktionieren, wie er ist?
Von nun an wird der Test jedes Mal ausgeführt, wenn Sie einen Commit durchführen. Wenn Sie den Test bestehen, sieht er mit der Markierung: white_check_mark: gut aus.
Bisher habe ich versucht, Befehle mit argparse zu erstellen, mit setup.py zu packen und mit GitHub-Aktionen automatisiert zu testen. In Zukunft möchte ich mit dieser Methode Fickbefehle in Massenproduktion herstellen.
Obwohl in diesem Artikel nicht behandelt, kann es sinnvoll sein, beim Erstellen von Befehlszeilentools zusätzlich zu argparse click usw. zu verwenden.
Recommended Posts