Seite 1 von 1

Versionsnummer in Code, Docstring und distutils

Verfasst: Sonntag 12. Mai 2013, 09:40
von Metex
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!

Re: Versionsnummer in Code, Docstring und distutils

Verfasst: Sonntag 12. Mai 2013, 09:47
von 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.

Re: Versionsnummer in Code, Docstring und distutils

Verfasst: Sonntag 12. Mai 2013, 10:12
von Metex
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.

Re: Versionsnummer in Code, Docstring und distutils

Verfasst: Sonntag 12. Mai 2013, 10:17
von DasIch
Wenn man wieso auch immer die eigene Library nicht in setup.py importieren kann, wird recht häufig einfach die Datei mit __version__ "geparst".

Re: Versionsnummer in Code, Docstring und distutils

Verfasst: Sonntag 12. Mai 2013, 17:01
von Metex
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!

Re: Versionsnummer in Code, Docstring und distutils

Verfasst: Donnerstag 16. Mai 2013, 00:27
von Leonidas
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.