Créez un fichier dans votre arbre des sources, par exemple dans yourbasedir/yourpackage/_version.py . Faites en sorte que ce fichier ne contienne qu'une seule ligne de code, comme ceci :
__version__ = "1.1.0-r4704"
Puis dans votre setup.py, ouvrez ce fichier et récupérez le numéro de version comme ceci :
verstr = "unknown"
try:
verstrline = open('yourpackage/\_version.py', "rt").read()
except EnvironmentError:
pass # Okay, there is no version file.
else:
VSRE = r"^\_\_version\_\_ = \['\\"\](\[^'\\"\]\*)\['\\"\]"
mo = re.search(VSRE, verstrline, re.M)
if mo:
verstr = mo.group(1)
else:
raise RuntimeError("unable to find version in yourpackage/\_version.py")
Enfin, en yourbasedir/yourpackage/__init__.py
Importez _version comme ceci :
\_\_version\_\_ = "unknown"
try:
from \_version import \_\_version\_\_
except ImportError:
# We're running in a tree that doesn't have a \_version.py, so we don't know what our version is.
pass
Un exemple de code qui fait cela est le paquet "pyutil" que je maintiens. (Voir PyPI ou recherche google -- stackoverflow m'interdit d'inclure un hyperlien vers celui-ci dans cette réponse).
@pjeby a raison de dire que vous ne devez pas importer votre paquet depuis son propre setup.py. Cela fonctionnera lorsque vous le testerez en créant un nouvel interpréteur Python et en exécutant setup.py dans celui-ci en premier lieu : python setup.py
mais il y a des cas où cela ne fonctionne pas. C'est parce que import youpackage
ne signifie pas qu'il faut lire le répertoire de travail actuel pour y trouver un répertoire nommé "yourpackage", mais qu'il faut chercher dans le répertoire courant sys.modules
pour une clé "yourpackage" et ensuite pour faire diverses choses si elle n'est pas là. Ainsi, cela fonctionne toujours lorsque vous faites python setup.py
parce que vous avez un nouveau, vide sys.modules
mais cela ne fonctionne pas en général.
Par exemple, que se passe-t-il si py2exe exécute votre setup.py dans le cadre du processus d'empaquetage d'une application ? J'ai vu un cas comme celui-ci où py2exe mettait un numéro de version erroné sur un paquet parce que le paquet obtenait son numéro de version à partir de import myownthing
dans son setup.py, mais une version différente de ce paquet avait été précédemment importée lors de l'exécution de py2exe. De même, que se passe-t-il si setuptools, easy_install, distribute ou distutils2 essaie de construire votre paquet dans le cadre d'un processus d'installation d'un autre paquet qui dépend du vôtre ? Le fait que votre paquet soit importable au moment où son setup.py est évalué, qu'une version de votre paquet ait déjà été importée au cours de la vie de cet interpréteur Python, que l'importation de votre paquet nécessite l'installation préalable d'autres paquets ou qu'elle ait des effets secondaires, peut modifier les résultats. J'ai eu plusieurs fois l'occasion d'essayer de réutiliser des paquets Python, ce qui a posé des problèmes à des outils comme py2exe et setuptools, car leur setup.py importe le paquet lui-même afin de trouver son numéro de version.
D'ailleurs, cette technique se marie bien avec les outils permettant de créer automatiquement le fichier yourpackage/_version.py
pour vous, par exemple en lisant votre historique de contrôle de révision et en écrivant un numéro de version basé sur la balise la plus récente dans l'historique de contrôle de révision. Voici un outil qui fait cela pour darcs : http://tahoe-lafs.org/trac/darcsver/browser/trunk/README.rst et voici un extrait de code qui fait la même chose pour git : http://github.com/warner/python-ecdsa/blob/0ed702a9d4057ecf33eea969b8cf280eaccd89a1/setup.py#L34
3 votes
Je pense que c'est à peu près la même question que stackoverflow.com/questions/458550/ .