Roadmap zum Veröffentlichen von Python-Paketen

Wir haben die Schritte zusammengefasst, die zum Erstellen und Veröffentlichen eines Python-Pakets erforderlich sind. Wir planen, zu einem späteren Zeitpunkt Links zu Referenzmaterialien hinzuzufügen oder einen anderen Artikel für die spezifische Verwendung und Details des Tools zu erstellen.

Ich werde das Paket um Februar 2020 veröffentlichen! Ich dachte, aber es fiel mir schwer, nicht zu wissen, womit ich anfangen sollte. Wir haben die während des Entwicklungsprozesses gewonnenen Erkenntnisse zusammengefasst und hoffen, dass sie für diejenigen hilfreich sind, die daran denken, sie in Zukunft zu veröffentlichen!

Zielpakete:

Überblick

  1. [Prüfung des Inhalts](# 0-Prüfung des Inhalts)
  2. [Entwicklungsumgebung](# 1-Entwicklungsumgebung)
  3. [Codierung](# 2-Codierung)
  4. [Testbetrieb](# 3-Testbetrieb)
  5. [Dokument erstellen](# 4 - Dokument erstellen)

0. Prüfung des Inhalts

Zu berücksichtigende Fragen:

Werkzeug:

--Mindmap

1. Entwicklungsumgebung

Während Sie eine Entwicklungsumgebung auf Ihrem lokalen PC erstellen, müssen Sie einen Mechanismus zum Veröffentlichen des erstellten Codes einrichten. Wenn Sie Git verwenden, um den Änderungsverlauf jederzeit aufzuzeichnen, können Sie den Entwicklungsstatus effizient erfassen.

Repository (Codespeicherung / Aufzeichnung des Änderungsverlaufs)

Erstellen Sie ein Remote-Repository für die Entwicklung auf GitHub und klonen Sie es zur Entwicklung in Ihre lokale Umgebung. Wenn Sie fertig sind, legen Sie einen Commit in Ihrer lokalen Umgebung fest und senden Sie ihn an das Remote-Repository.

Python-Ausführungsumgebung

Wenn Sie Windows 10 verwenden, empfehlen wir, wenn möglich WSL (Windows Subsystem für Linux) oder WSL2 zu verwenden.

Einführung des Editors

Bereiten Sie einen Editor oder eine IDE (Integrated Development Environment) in Ihrer lokalen Umgebung vor.

Visual Studio Code (VScode) wird empfohlen. Zahlreiche Plug-Ins stehen zur Verfügung, um die Handhabung von Git-Operationen zu vereinfachen.

Abhängige Pakete verwalten

Pipenv und Poesie scheinen vielversprechend. Ich benutze pipenv, aber ich denke darüber nach, auf Poesie umzusteigen, weil ich häufig Fehler bekomme und langsam bin. (Es wurde nicht überprüft, ob Poesie schneller ist ...)

Entwicklungsworkflow

Es scheint verschiedene Möglichkeiten zu geben, wie Zweige verwendet werden sollen und wann sie zusammengeführt werden sollen, z. B. Git Flow und GitHub Flow. Wenn Sie sich auf der Ebene von Einzelpersonen oder wenigen Personen entwickeln, empfehlen wir die Verwendung des einfachen Gitlab Flow.

Es ist auch nützlich, die Ausgabefunktion von GitHub als Ort für Aufgabenlisten und Diskussionen zu verwenden. Einzelne Nummern werden Problemen zugewiesen und Pull-Anforderungen wie "Nr. 1". Geben Sie also ein Problem mit Problem Nr. 1 an, arbeiten Sie an Zweig "Problem 1" basierend auf der Ausgabenummer und verwenden Sie standardmäßig die Pull-Anforderung Das Verfahren besteht darin, es zu einem Zweig zusammenzuführen.

Versioning Als Hauptfluss halte ich es für zweckmäßig, in zwei Teilen zu entwickeln, der "Entwicklungsversion (verwaltet von GitHub)" und der "stabilen Version (verwaltet von PyPI)". Die Entwicklungsversion wird gemäß dem oben beschriebenen Entwicklungsablauf erstellt.

Es schien wenig feste Namen für die Entwicklungsversion zu geben. In meinem Fall gebe ich eine Entwicklungsversion direkt nach dem Zusammenführen und dem Schließen des Problems.

(Beispiel) Wenn Problem Nr. 2 aufgrund einer Fehlerbehebung geschlossen wird: 2.0.1-alpha.new.1 → 2.0.1-beta.new.1.fix.2

Wenn eine große Anzahl von Problemen geschlossen ist oder Sie dringend einen Fehler in der stabilen Version beheben müssen, folgen Sie der Semantic Versioning für die stabile Version. Bitte erhöhen Sie die Version.

2. Codierung

Wir haben die Elemente zusammengefasst, die beim Codieren beachtet werden müssen, z. B. die Ordnerstruktur.

Paketnamen

Wenn Sie eine einzeilige Beschreibung des Pakets in Englisch erstellen und ein Alphabet auswählen, um es zum Paketnamen zu machen, müssen Sie sich keine Sorgen machen. Die Reihenfolge der Alphabetauswahl ist mir egal (lacht)

Beispiel: Python-Paket für ** COV ** ID-19 anal ** y ** sis mit ** ph ** ase-abhängigen ** SIR ** - abgeleiteten ODE-Modellen = ** CovsirPhy **

Möglicherweise möchten Sie auch die Google-Suche verwenden, um Überschneidungen mit anderen Dienstnamen zu vermeiden.

Ich denke, es wird schwierig sein, es später zu ändern, da es viele Probleme verursachen wird, wie z. B. das Ändern der Installationsmethode.

Informationen zur Paketidentifikation

Wenn Sie Poesie verwenden, müssen Sie sie in eine separate Datei schreiben. Wenn Sie jedoch pipenv zum Verwalten abhängiger Pakete verwenden, erstellen Sie die Dateien "setup.py" und "setup.cfg" oben im Repository. Bitte.

setup.py


from setuptools import setup
setup()

setup.cfg


[metadata]
name =Paketnamen
version = attr:Paketnamen.__version__.__version__
url =URL wie Repository
author =Autorenname
author_email =Mail Adresse
license = Apache License 2.0
license_file = LICENSE
description =Einzeilige Beschreibung des Pakets
long_description = file: README.rst
keywords =Stichwort
classifiers =
    Development Status :: 5 - Production/Stable
    License :: OSI Approved :: Apache Software License
    Programming Language :: Python :: 3.7
    Programming Language :: Python :: 3.8


[options]
packages = find:
install_requires =
    #Abhängiger Paketname
    numpy
    matplotlib

Bitte ersetzen Sie das in Japanisch geschriebene Teil und den entsprechenden Lizenznamen! Wenn Sie ein abhängiges Paket hinzufügen, müssen Sie es jederzeit zum Feld "install_requires" hinzufügen.

Ordnerstruktur

Erstellen Sie einen Ordner mit dem Paketnamen (oder dem src-Ordner) oben im Repository. Erstellen Sie zunächst leere Dateien "__version __. Py" und "__init __. Py".

Und entscheiden wir uns für die Ordnerstruktur (Modulstruktur). Achten Sie auf den zirkulären Import [^ 1]. Es kommt vor, dass "src / A / a1.py" von "src / B / b1.py" importiert wird und "src / B / b2.py" von "src / A / a2.py" importiert wird. Lass uns nicht. Es verursacht keinen Fehler in der Entwicklungsumgebung, aber es scheint, dass ein Fehler auftreten kann, wenn pip die stabile Version installiert, so dass ich es schwer hatte. Ich habe die stabile Chargennummer nur für diesen Fix zweimal erhöht.

[^ 1]: Was passiert, wenn Sie zyklisch mit Python importieren

Das Verwalten mit "src / __ version __. Py" anstelle von "setup.cfg" ist praktisch, da Sie die Versionsnummer auch im Paket abrufen und anzeigen können. Im obigen Beispiel von setup.cfg wird diese Datei von version = attr: Paketname .__ version __.__ version __ aufgerufen.

__version__.py


__version__ = "0.1.0"

Das Folgende ist der Fall beim Erstellen einer Funktion namens "line_plot" in "src / util / plotting.py". Wenn Sie "from src.util.plotting import line_plot" schreiben, können Sie "from src. import line_plot" anstelle von "from src.util.plotting import line_plot" aufrufen, wenn Sie die Pip-Installation durchführen.

__init__.py


#!/usr/bin/env python
# -*- coding: utf-8 -*-

# version
from src.__version__ import __version__
# util
from src.util.plotting import line_plot


def get_version():
    """
    Return the version number,wie Paketname v0.0.0
    """
    return f"Paketname v{__version__}"


__all__ = ["line_plot"]

Durch Schreiben von __all__ = [" line_plot "] können Sie die Korrekturbestätigung von Code-Formatierungswerkzeugen wie pylint vermeiden (obwohl Sie die Einstellung von pylint ändern können, um die Korrekturbestätigung auszublenden). Sie können auch line_plot verwenden, indem Sie from src import * ausführen, aberimport *ist veraltet ...

Registrieren Sie sich bei PyPI

Wenn Sie den Mindestcode, die Setup-Datei und die Versionsnummer haben, können Sie das Paket in test-PyPI oder PyPI registrieren!

3. Betrieb testen

Es ist unvermeidlich, dass Fehler auftreten (dies kann auch eine treibende Kraft für die Entwicklung sein), aber wir möchten Fehler vor der Veröffentlichung so weit wie möglich beseitigen, um den Geist nicht zu zermürben. Ich denke nicht, dass es notwendig ist, Tests zu 100% genau zu schreiben, aber ich denke, Entwickler müssen Testcode schreiben und den Vorgang im Voraus überprüfen, zumindest für die Methode, die Benutzer hauptsächlich verwenden.

Test erstellen

Es gibt mehrere bekannte Testcode-Erstellungs- / Ausführungspakete wie "unittest", "pytest", "doctest", "nase". Ich persönlich benutze pytest.

Automatische Testausführung

Grundsätzlich handelt es sich um "lokal entwickeln und lokal testen". Wenn jedoch die Anzahl der Testcodes zunimmt und ein Test länger als 10 Minuten dauert, kann er möglicherweise nicht lokal verarbeitet werden.

In diesem Fall sollten Sie den Test mithilfe des CI-Tools (Continuous Integration) automatisch ausführen. Bekannt sind GitHub-Aktionen (die über den GitHub-Repository-Bildschirm erstellt werden können), Travis CI, Semaphore. Wenn es sich um ein Open Source-Projekt handelt, können Sie es bis zu einem gewissen Grad kostenlos verwenden.

Vielen Dank für Semaphore. Es gibt nicht viele Artikel auf Japanisch, daher plane ich, zu einem späteren Zeitpunkt einen Artikel zu schreiben.

Für die Datenwissenschaft

Bei einem Paket für Data Science (Herunterladen einer CSV-Datei aus einer Datenbank / Analysieren von Daten) ändern sich die Eingabeargumente für jede Funktion und jede Klasse von Moment zu Moment, und der Entwickler sagt alle Eingabewerte voraus und testet sie. Ist schwer zu machen. Ich denke, die folgenden drei Muster können als Lösungen betrachtet werden.

--Überprüfen Sie den Typ der Eingabedaten (isinstance (data, pandas.DataFrame), set (data.columns) .issubset (fields)) --Überprüfen Sie den Ausgabedatentyp

4. Dokumenterstellung

Die Dokumentation ist wichtig, um die Verwendung und Verwendung des Pakets zu vermitteln und zu fördern.

Erstellen einer Dokumentzeichenfolge

Schreiben Sie zunächst die Dokumentzeichenfolge für jede Python-Funktion / Klasse / Methode (vorzugsweise in Englisch). Ich denke, es ist besser, bei der Implementierung des Codes parallel zu schreiben.

Es gibt reStructuredText-Stil, Google-Stil und Numpy-Stil als Notationen, aber Google-Stil, der weniger wahrscheinlich nach oben und unten redundant ist, wird empfohlen. (Als ich Python nur für das private Projekt verwendete, schrieb ich es in meinem eigenen Stil, ähnlich dem Numpy-Stil, aber ich wechselte zum Google-Stil.)

Anwendungsfalldokumentation

Wenn Sie das Verwendungsbeispiel dokumentieren möchten, kann der Jupyter Notebook-Ausdruck (.ipynb) hilfreich sein. Sie können die Beschreibung, den Code und die Ergebnisse zusammen anzeigen.

Beispiel: CovsirPhy: Verwendung (schnellste Version)

Konvertierung nach Markdown / html

Sie können Pandoc oder Sphinx (api-doc) verwenden, um docstring- und .ipynb-Dateien halbautomatisch in das Markdown / HTML-Format zu konvertieren. Ich werde es in diesem Artikel weglassen, weil es lang sein wird, aber es ist einfach, weil Sie eine Homepage nur mit Python erstellen können, ohne die Details von HTML und CSS zu kennen.

Dokumentation veröffentlichen

Verwenden Sie GitHub Pages, um die HTML-Datei des GitHub-Repositorys von Zeit zu Zeit zu aktualisieren. Sie können das Dokument selbst veröffentlichen und aktualisieren.

Nachwort

Ich habe die Details weggelassen und mich beeilt, aber danke fürs Stöbern. Bitte teilen Sie uns mit, ob es einen Überschuss oder Mangel oder andere Methoden gibt. Es wird von Zeit zu Zeit aktualisiert.

Danke für deine harte Arbeit!

Recommended Posts

Roadmap zum Veröffentlichen von Python-Paketen
Python [für mich]
Einstellungen zum lokalen Hochladen von Python-Paketen auf PyPI
Python-Grundlagen ② für Anweisung
Python-Pakete und -Module
Über Python für ~ (Bereich)
Python Lehrbuch für Anfänger
Verwenden von Python # externen Paketen
Toolchain für Python für Android
OpenCV für Python-Anfänger
Installieren Sie Python (für Windows)
[Python] für Anweisungsfehler
Wartung der Python-Umgebung für Projekte
Python-Memo (für mich): Array
Python-Liste, für Anweisung, Wörterbuch
Python für die Datenanalyse Kapitel 4
Lernablauf für Python-Anfänger
Installationsverfahren für Python 3.6 [für Windows]
BigQuery-Integration für Python-Benutzer
Python-Lernplan für KI-Lernen
Für Mac einrichten (Python)
Lernen Sie Python-Pakete und -Module kennen
Python Tkinter Memo (für mich)
OpenCV3-Installation für Python3 @macOS
Aufbau einer Python-Umgebung für Mac
Techniken zum Sortieren in Python
pp4 (Python Power für alles)
Python3-Umgebungskonstruktion (für Anfänger)
Installation der Python 3-Serie für Mac
Python #Funktion 2 für Super-Anfänger
Python-Vorlage für Codeforces-manuelle Test-
Grundlegende Python-Grammatik für Anfänger
Notizen für 3 Monate, seit ich Python gestartet habe
Qt für Python App Selbstaktualisierung
Python für die Datenanalyse Kapitel 2
100 Pandas klopfen für Python-Anfänger
Checkios Empfehlung zum Erlernen von Python
Schlüsselwortargumente für Python-Funktionen
[Zum Organisieren] Python-Entwicklungsumgebung
[Python] Beispielcode für die Python-Grammatik
Python #Funktion 1 für Super-Anfänger
[Python / PyQ] 4. Liste zur Anweisung
Einfacher HTTP-Server für Python
[Python + Selen] Tipps zum Scraping
Python #Liste für Super-Anfänger
~ Tipps für Python-Anfänger mit Liebe von Pythonista ③ ~
Extrahieren Sie nur Python für die Vorverarbeitung
Einrückungsformatierung von Python-Skripten
Einführung in Python For, While
Über "für _ in range ():" von Python
tesseract-OCR für Python [japanische Version]
[Python] Iterative Verarbeitung (für, während)
Python für die Datenanalyse Kapitel 3
Installieren Sie dlib für Python (Windows)
Überprüfen Sie Python auf Speicherlecks
Python3-Standardeingabe für wettbewerbsfähige Programmierung
[Paketwolke] Verwalten Sie Python-Pakete mit der Paketwolke