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:
Zu berücksichtigende Fragen:
Werkzeug:
--Mindmap
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.
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.
Wenn Sie Windows 10 verwenden, empfehlen wir, wenn möglich WSL (Windows Subsystem für Linux) oder WSL2 zu verwenden.
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.
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 ...)
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.
Wir haben die Elemente zusammengefasst, die beim Codieren beachtet werden müssen, z. B. die Ordnerstruktur.
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.
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.
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 ...
Wenn Sie den Mindestcode, die Setup-Datei und die Versionsnummer haben, können Sie das Paket in test-PyPI oder PyPI registrieren!
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.
Es gibt mehrere bekannte Testcode-Erstellungs- / Ausführungspakete wie "unittest", "pytest", "doctest", "nase". Ich persönlich benutze pytest
.
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.
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
Die Dokumentation ist wichtig, um die Verwendung und Verwendung des Pakets zu vermitteln und zu fördern.
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.)
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)
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.
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.
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