Standardmethode zum Einbetten der Version in das Python-Paket?
Gibt es einen standard-Weg zu assoziieren version-string, der mit einem python-Paket in der Weise, dass ich tun könnte?
import foo
print foo.version
Ich würde vorstellen, es gibt einige Wege, die zum abrufen der Daten ohne zusätzliche hardcoding, da minor/major strings angegeben werden, in setup.py
schon. Alternative Lösung, die ich gefunden haben war import __version__
in meinem foo/__init__.py
und dann haben __version__.py
generiert setup.py
.
InformationsquelleAutor der Frage Dimitri Tcaciuc | 2009-01-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nicht direkt eine Antwort auf deine Frage, aber man sollte überlegen die Namensgebung
__version__
nichtversion
.Dies ist fast ein quasi-standard. Viele Module in der standard-Bibliothek verwenden
__version__
und dies ist auch in viele von 3rd-party-Module, so ist es der quasi-standard.Normalerweise
__version__
ist ein string, aber manchmal ist es auch ein float oder Tupel.Edit: wie erwähnt von S. Lott (Danke!), PEP 8 sagt es ausdrücklich:
Sollten Sie auch sicherstellen, dass die Versionsnummer entspricht dem beschriebenen format in PEP 440 (PEP 386 einer früheren version dieses Standards).
InformationsquelleAutor der Antwort oefe
Benutze ich ein Einzelzimmer
_version.py
- Datei als "einmal cannonical Ort" zum speichern von Versionsinformationen:Es bietet eine
__version__
Attribut.Es bietet die standard-Metadaten-version. Daher wird es erkannt durch
pkg_resources
oder andere tools zum Parsen der Paket-Metadaten (EI-INFO und/oder PKG-INFO, PEP 0345).Ist es nicht importieren Sie Ihr Paket (oder irgendetwas anderes) beim Bau Ihr Paket, was zu Problemen führen kann in manchen Situationen. (Siehe die Kommentare unten, über welche Probleme diese verursachen können.)
Gibt es nur einen Ort, der die Versionsnummer niedergeschrieben ist, so gibt es nur einen Ort, es zu ändern, wenn sich die Versionsnummer ändert, und es ist weniger Wahrscheinlichkeit von inkonsistenten Versionen.
Hier ist, wie es funktioniert: "eine kanonische Ort" zu speichern, wird die Versionsnummer ein .py-Datei, mit Namen "_version.py" die ist in Ihrem Python-Paket, zum Beispiel in
myniftyapp/_version.py
. Diese Datei ist ein Python-Modul, aber Ihre setup.py nicht importieren! (Das wäre eine Niederlage-Funktion 3.) Statt Ihre setup.py weiß, dass der Inhalt dieser Datei ist sehr einfach, so etwas wie:Und so Ihre setup.py öffnet die Datei und parst es, mit code wie:
Dann Ihre setup.py übergibt, dass die Zeichenfolge als Wert des "version" - argument zu
setup()
so befriedigend, Funktion 2.Befriedigen Merkmal 1 haben, können Sie Ihr Paket (zur Laufzeit, nicht bei der Installation!) importieren Sie die _version-Datei aus
myniftyapp/__init__.py
wie diese:Hier ist ein Beispiel für diese Technikdass ich schon seit Jahren nutzen.
Den code in diesem Beispiel ist ein bisschen komplizierter, aber das vereinfachte Beispiel, das ich schrieb in diesem Kommentar sollte eine vollständige Umsetzung.
Hier ist Beispiel-code für den Import der version.
Wenn Sie sehen, nichts falsch mit diesem Ansatz, lassen Sie es mich bitte wissen.
InformationsquelleAutor der Antwort Zooko
Umgeschrieben 2017-05
Nach mehr als zehn Jahren ein schreiben von Python-code und die Verwaltung verschiedener Pakete, die ich kam zu dem Schluss, dass DIY ist vielleicht nicht der beste Ansatz.
Begann ich mit
pbr
- Paket für den Umgang mit der Versionsverwaltung in meiner Pakete. Wenn Sie der Verwendung von git als die SCM, dieses passen in Ihren workflow wie Magie, sparen Sie Ihre Wochen der Arbeit (Sie werden überrascht sein darüber, wie Komplex das Thema werden kann).Heute pbr ist auf Platz #11 am meisten verwendeten python-Paket und erreichen dieses Niveau nicht enthalten keine schmutzigen tricks: war nur eines: die Festsetzung einer gemeinsamen Verpackung problem in einer sehr einfachen Weise.
pbr
können mehr tun, das Paket Bürde der Wartung, ist nicht beschränkt auf Versionierung, aber es zwingt Sie nicht, sich zu verabschieden, alle Ihre Vorteile.So, um Ihnen eine Idee über, wie es aussieht verabschieden, pbr in einem commit haben Sie einen Blick swiching Verpackung zu pbr
Wahrscheinlich würden Sie beobachtet, dass die version nicht gespeichert, überhaupt in das repository. PBR erkennt es aus dem Git branches und tags.
Muss sich keine sorgen machen über das, was passiert, wenn Sie nicht über ein git-repository, da pbr bedeutet "kompilieren" und cache die version, wenn Sie ein Paket oder installieren Sie die Anwendungen, so gibt es keine runtime-Abhängigkeit von git.
Alten Lösung
Hier ist die beste Lösung, die ich bisher gesehen habe, und es erklärt auch, warum:
Innen
yourpackage/version.py
:Innen
yourpackage/__init__.py
:Innen
setup.py
:Wenn Sie wissen, einen anderen Ansatz, der besser zu sein scheint, lassen Sie es mich wissen.
InformationsquelleAutor der Antwort sorin
Pro die latente PEP 396 (Modul-Version Zahlen)es ist ein Vorschlag für die Art und Weise, dies zu tun. Es beschreibt, mit der Begründung, eine (zugegebenermaßen optional) standard für Module Folgen. Hier ist ein snippet:
InformationsquelleAutor der Antwort Oddthinking
Obwohl dies wahrscheinlich viel zu spät, es ist eine etwas einfachere alternative zu der vorherigen Antwort:
(Und es wäre ziemlich einfach zu konvertieren von auto-increment-Portionen-version zahlen in eine Zeichenfolge mit
str()
.)Natürlich, von dem, was ich gesehen habe, neigen die Menschen dazu, etwas zu verwenden, wie die bereits erwähnte version bei der Verwendung von
__version_info__
und als solche speichern Sie es als ein Tupel von int-Werten; jedoch, ich verstehe nicht ganz den Punkt sehen dabei, wie ich bezweifle, dass es Situationen gibt, wo würden Sie führen mathematische Operationen wie addition und Subtraktion auf Teile von Versionsnummern für andere Zwecke als die Neugier oder die auto-Inkrementierung (und selbst dannint()
undstr()
verwendet werden können, relativ leicht). (Auf der anderen Seite gibt es die Möglichkeit, dass jemand anderes den code erwarten ein numerisches Tupel statt eines Strings Tupel und somit keine.)Dies ist natürlich meine eigene Meinung, und ich würde gerne, wie andere " - Eingang zur Verwendung eines numerischen Tupel.
Als shezi erinnerte mich, (lexikalischen) Vergleiche der Anzahl Saiten müssen nicht unbedingt zum gleichen Ergebnis wie die direkte numerische Vergleiche; führende Nullen erforderlich sein würde dafür sorgen. Also am Ende, speichern
__version_info__
(oder was auch immer es genannt werden würde) als ein Tupel von integer-Werten wäre für effizientere version Vergleiche.InformationsquelleAutor der Antwort JAB
Verwende ich eine JSON-Datei in das Paket dir. Das passt Zooko ' s-Anforderungen.
Innen
pkg_dir/pkg_info.json
:Innen
setup.py
:Innen
pkg_dir/__init__.py
:Lege ich auch andere Informationen in
pkg_info.json
wie Autor. Ichwie zu verwenden JSON, da kann ich das automatisieren der Verwaltung von Metadaten.
InformationsquelleAutor der Antwort Andy Lee
Scheint es nicht zu sein, einen standard zum einbetten einer version-string in ein python-Paket. Die meisten Pakete, die ich gesehen habe verwenden eine Variante der Lösung, D. H. eitner
Einbetten der version in
setup.py
und habensetup.py
generieren eines Moduls (z.B.version.py
) nur mit version-info, importiert, die von dem Paket, oderUmgekehrt: die version info in Ihrem Paket selbst, und importieren dass um die version in
setup.py
InformationsquelleAutor der Antwort dF.
Erwähnenswert ist auch, dass so gut wie
__version__
ein semi-std. in python so ist__version_info__
was ist ein Tupel, in einfachen Fällen können Sie nur so etwas wie:...und Sie können das
__version__
string aus einer Datei, oder was auch immer.InformationsquelleAutor der Antwort James Antill
Viele dieser Lösungen hier ignorieren
git
version-tags, die immer noch bedeutet, dass Sie haben, um track-version in mehreren Orten (bad). Ich näherte mich dies mit den folgenden Zielen:git
repogit tag
/push
undsetup.py upload
Schritte mit einem einzigen Befehl, der nimmt keine Eingaben.Wie es funktioniert:
Vom
make release
Befehl, die letzten tagged version im git-repo gefunden wird und erhöht wird. Der tag ist zurückgedrängtorigin
.Den
Makefile
speichert die version insrc/_version.py
wo es gelesen wird vonsetup.py
und auch im release. Nicht überprüfen_version.py
in die Quellcodeverwaltung!setup.py
Befehl liest die neue version-string auspackage.__version__
.Details:
Makefile
Den
release
Ziel immer Schritten die 3. version stellige, aber Sie können dienext_minor_ver
odernext_major_ver
erhöhen die anderen Ziffern. Die Befehle stützen sich auf denversionbump.py
script, der überprüft wird, in die Wurzel des repo -versionbump.py
Dies tut die schwerarbeit, wie die Verarbeitung und erhöht die Versionsnummer von
git
.__init__.py
Den
my_module/_version.py
- Datei importiert wird, inmy_module/__init__.py
. Stellen Sie keine statische install-config hier, dass Sie wollen zusammen mit Ihrem Modul.setup.py
Den letzten Schritt Lesen Sie die versions-info aus der
my_module
Modul.Natürlich, für alle diese arbeiten musst du mindestens ein version-tag in Ihrem repo zu starten.
InformationsquelleAutor der Antwort cmcginty
Ich sah auch einen anderen Stil:
InformationsquelleAutor der Antwort L1ker
Pfeil verarbeitet es auf eine interessante Weise.
In
arrow/__init__.py
:In
setup.py
:InformationsquelleAutor der Antwort Anto
Für was es Wert ist, wenn Sie mit NumPy-distutils,
numpy.distutils.misc_util.Configuration
hat einemake_svn_version_py()
Methode, bettet die revision-Nummer im innerenpackage.__svn_version__
in die variableversion
.InformationsquelleAutor der Antwort Matt
version.py
Datei nur mit__version__ = <VERSION>
param in der Datei. In dersetup.py
- Datei importieren, die__version__
param und setzen Sie den Wert in dersetup.py
- Datei wie folgt:version=__version__
setup.py
- Datei mitversion=<CURRENT_VERSION>
- CURRENT_VERSION ist hardcoded.Da wir nicht möchten, ändern Sie manuell die version der Datei jedes mal, wenn wir erstellen einen neuen tag bereit zu release eine neue Paket-version), können wir die folgenden..
Empfehle ich bumpversion Paket. Ich benutze es schon seit Jahren zu stoßen, eine version.
starten Sie, indem Sie
version=<VERSION>
zu Ihremsetup.py
- Datei, wenn Sie es nicht haben bereits.Sollten Sie ein kurzes Skript wie das jedes mal, wenn Sie stoßen eine version:
Fügen Sie dann eine Datei pro repo genannt:
.bumpversion.cfg
:Hinweis:
__version__
parameter unterversion.py
- Datei, wie es wurde vorgeschlagen, in anderen Beiträgen und aktualisieren Sie die bumpversion-Datei wie folgt:[bumpversion:file:<RELATIVE_PATH_TO_VERSION_FILE>]
git commit
odergit reset
alles in deinem repo, andernfalls erhalten Sie eine schmutzige repo-Fehler.InformationsquelleAutor der Antwort Oran
Wenn Sie die Verwendung von CVS (RCS oder) und wollen eine schnelle Lösung, die Sie verwenden können:
(Natürlich, die revision-Nummer wird ersetzt werden Sie durch CVS.)
Dies gibt Ihnen eine Druckversion und eine version-info, die Sie verwenden können, um zu überprüfen, dass das Modul, das Sie importieren, die mindestens die erwarteten version:
InformationsquelleAutor der Antwort Martin Ibert