Erstellen Sie eine Befehlszeilen-App in Python, um die Aktionen setup.py, argparse und GitHub zu verstehen

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.

Ergebnisse

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.

Erstellen einer Befehlszeilenschnittstelle

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)).

Verpackung

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.

Mit pip installieren

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

Automatisiertes Testen mit GitHub-Aktionen

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.

Erstellen Sie YAML for Action

Wenn Sie zur Registerkarte "Aktionen" des Repositorys gehen, wird ein Bildschirm wie der folgende angezeigt. Versuchen wir es also zunächst mit "Python-Paket".

919fa3a4-176e-419d-b249-4892ffe4f18d.jpg

Der Bildschirm sieht wie folgt aus. Drücken Sie einfach "Start Commit", ohne an etwas zu denken.

71a5aa3e-4fbb-4a7b-aaad-32fcee02ad5f.jpg

Der Test schlägt fehl.

9f8800a4-0658-4dc6-a264-a9aa1a1e1348.jpg

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?

2e3474ac-5bb2-49ed-a87f-c349eaf64855.jpg

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.

caaef1bb-00d2-4be6-b7b8-eceac4bb906a.jpg

Zusammenfassung

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.

Andere

Obwohl in diesem Artikel nicht behandelt, kann es sinnvoll sein, beim Erstellen von Befehlszeilentools zusätzlich zu argparse click usw. zu verwenden.

Recommended Posts

Erstellen Sie eine Befehlszeilen-App in Python, um die Aktionen setup.py, argparse und GitHub zu verstehen
So erhalten Sie eine Zeichenfolge aus einem Befehlszeilenargument in Python
Hinweise Ich habe nachgeschlagen, um Befehlszeilentools in Python zu erstellen
So empfangen Sie Befehlszeilenargumente in Python
So führen Sie einen Befehl mit einem Unterprozess in Python aus
Im Python-Befehl zeigt Python auf Python3.8
Erstellen Sie ein Befehlszeilenprogramm, um mit Python Dollar in Yen umzurechnen
[Python] Ich habe versucht, mit argparse ein einfaches Programm zu erstellen, das in der Befehlszeile funktioniert
Methode zum Erstellen einer Python-Umgebung in Xcode 6
Erstellen Sie eine einfache GUI-App in Python
Ich möchte eine Python-Umgebung erstellen
Wie bekomme ich Stacktrace in Python?
Starten Sie eine Flask-App in Python Anywhere
Zerlegen Sie Befehlsargumente in einer Zeile in Python
Ich habe ein privates Python-Paket, möchte aber pipenv auf GitHub Actions installieren und ein Docker-Image erstellen
Verschiedene Möglichkeiten, die letzte Zeile einer CSV-Datei in Python zu lesen
Ich habe einen Appdo-Befehl erstellt, um Befehle im Kontext der App auszuführen
Verwalten von Argumenten beim Implementieren eines Python-Skripts als Befehlszeilentool
Vorlage zum Erstellen von Befehlszeilenanwendungen in Python
[Python] So testen Sie den Befehlszeilen-Parser-Klick
Senden Sie eine Nachricht mit Python an LINE (LINE Notify)
Berechnen wir das statistische Problem mit Python
So löschen Sie einen Taple in einer Liste (Python)
Bereitstellung von GitHub-Aktionen für Azure App Service
Einbetten von Variablen in Python-Strings
Ich möchte mit Python ein Fenster erstellen
So erstellen Sie eine JSON-Datei in Python
Eine clevere Möglichkeit zur Zeitverarbeitung mit Python
Mach ein Janken-Spiel in einer Zeile (Python)
So fügen Sie Python ein Modul hinzu, das Sie in Julialang eingefügt haben
Meine Gedanken zur Python2.6-Befehlszeilen-App-Vorlage
So benachrichtigen Sie Discord-Kanäle in Python
[Einführung in Udemy Python3 + Application] 67. Befehlszeilenargumente
[Python] Wie zeichnet man mit Matplotlib ein Histogramm?
Ich kann nicht schlafen, bis ich einen Server erstellt habe !! (Einführung in den Python-Server an einem Tag)
Python-Ertrag verstehen Wenn Sie Ertrag in eine Funktion einfügen, wird dieser in einen Generator geändert
So hosten Sie die Web-App-Backend-Verarbeitung in Python mithilfe einer Leihserver-Subdomain
Analysieren Sie eine JSON-Zeichenfolge, die in eine Datei in Python geschrieben wurde
Ich möchte Timeout einfach in Python implementieren
Versuchen Sie, ein Python-Modul in C-Sprache zu erstellen
[Python] Wie zeichnet man mit Matplotlib ein Liniendiagramm?
Lassen Sie uns ein Befehls-Standby-Tool mit Python erstellen
[LINE Messaging API] Erstellen Sie mit Python ein umfangreiches Menü
Ich möchte in Python schreiben! (2) Schreiben wir einen Test
App-Entwicklung zum Twittern in Python aus Visual Studio 2017
Erstellen Sie ein Plug-In, das Python Doctest auf Vim ausführt (2)
Ich habe versucht, einen Pseudo-Pachislot in Python zu implementieren
Ein Memorandum zum Ausführen eines Python-Skripts in einer Bat-Datei
Ich möchte eine Datei mit Python zufällig testen
So erstellen Sie eine Django (Python) -Umgebung auf Docker
Schritte von der Installation von Python 3 bis zur Erstellung einer Django-App
Ich möchte mit einem Roboter in Python arbeiten.
Beachten Sie beim Initialisieren einer Liste in Python
Einführung in die lineare Algebra mit Python: A = LU-Zerlegung
[Python] Erstellt eine Methode zum Konvertieren von Radix in 1 Sekunde
Schreiben Sie Code in UnitTest, eine Python-Webanwendung