Versionsnummer in Code, Docstring und distutils

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Metex
User
Beiträge: 5
Registriert: Sonntag 14. August 2011, 06:30
Wohnort: Österreich

Hallo!
Ich habe schön einige Zeit gesucht, bin aber nicht fündig geworden. Vielleich weiß hier jemand die Antwort.

Problem:
Ein eigenes Modul in Python 2.7, dass von Version zu Version an Umfang zulegt, und dessen Doku mittels Sphinx dargestellt (bzw. verwaltet) wird.

Die Versionsnummer taucht auf:

im Code als Variable

Code: Alles auswählen

VERSION = 'x.y.z'
im Docstring

Code: Alles auswählen

""" ... Version: x.y.z -- """
und in den distutils (um tarballs zu fabrizieren) in der Datei setup.py:

Code: Alles auswählen

version='x.y.z'
Wie sorge ich dafür, dass an allen drei Stellen automatisch die selbe Versionsnummer verwendet wird?

Weiß jemand eine elegante Lösung?
Vielen Dank für die Mühe!
BlackJack

@Metex: Im Code sollte es per Konvention eher `__version__` anstelle von `VERSION` heissen. Dann lässt Du es aus dem Docstring einfach weg, denn es steht ja schon in `__version__`. Und in der ``setup.py`` importierst Du das Modul mit dem `__version__`-Attribut und verwendest es zum festlegen der Versionsnummer.
Metex
User
Beiträge: 5
Registriert: Sonntag 14. August 2011, 06:30
Wohnort: Österreich

Danke für die rasche Antwort. Daran habe ich nicht gedacht.
BlackJack hat geschrieben:@Metex: Im Code sollte es per Konvention eher `__version__` anstelle von `VERSION` heissen. Dann lässt Du es aus dem Docstring einfach weg, denn es steht ja schon in `__version__`. Und in der ``setup.py`` importierst Du das Modul mit dem `__version__`-Attribut und verwendest es zum festlegen der Versionsnummer.
  • von "VERSION" zu "__version__" wechseln ist trivial machbar
  • Im Doc-String auf die Versionsnummer zu verzichten schmerzt ein bisschen, aber mit Sphinx lassen sich per 'restructerd text' Variablen so bearbeiten, dass sie in der Doku auftauchen. "__version__" ist dann ohnehin ganz oben. Ist also machbar.
  • Problematischer für den Workflow ist der Import des neuen Moduls in die setup.py. Per "import blabla" wird die derzeit installierte Version ins setup.py importiert, nicht die neueste gerade bearbeitete Version. Diese einzeln für sich in den python-Pfad aufzunehmen ist unzweckmäßig. Auf die Schnelle fällt mir dazu keine Lösung ein.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Wenn man wieso auch immer die eigene Library nicht in setup.py importieren kann, wird recht häufig einfach die Datei mit __version__ "geparst".
Metex
User
Beiträge: 5
Registriert: Sonntag 14. August 2011, 06:30
Wohnort: Österreich

Problem gelöst :mrgreen:

1. Im Docstring des Moduls auf die Versionsbezeichnung verzichten (einstweilen, eventuell geht mit 'restructeredtext' und Sphinx noch was)

2. Im Modul-Quelltext eine Variable

Code: Alles auswählen

__version__ = 'x.y.z'
anlegen.

3. In setup.py Modul importieren. Aber um zu garantieren, dass das NEUE Modul und nicht das im System installierte verwendet wird, das Modul 'imp' verwenden:

Code: Alles auswählen

...
import imp
name_des_moduls = 'mymodule'
pfad_des_moduls = './source/mymodule.py'
mymodule = imp.load_source(name_des_moduls,pfad_des_moduls)
# enspricht dem 'import mymodule', nur, dass das richtige Modul importiert wird.
version = mymodule.__version__
print version
...
Dank an alle!
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Das wird wohl scheitern wenn man ``setup.py`` aufruft während man nicht in dem Ordner ist in dem ``setup.py`` liegt.

So etwas wie ``python /tmp/module/setup.py install`` ist IMHO ein durchaus gültiger Use-Case. Also sollte man schauen dass man aus dem relativen Pfad einen absoluten macht.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten