Создайте файл в вашем исходном дереве, например, в yourbasedir / yourpackage / _version.py. Пусть этот файл содержит только одну строку кода, например:
__version__ = "1.1.0-r4704"
Затем в вашем файле setup.py откройте этот файл и найдите номер версии следующим образом:
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")
Наконец, в yourbasedir/yourpackage/__init__.py
import _version вот так:
__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
Примером кода, который делает это, является пакет "pyutil", который я поддерживаю. (См. PyPI или поиск в Google - stackoverflow запрещает мне включать гиперссылку на него в этом ответе.)
@ pjeby прав, что вы не должны импортировать свой пакет из его собственного setup.py. Это сработает, когда вы протестируете его, создав новый интерпретатор Python и выполнив в нем файл setup.py: python setup.py
, но есть случаи, когда он не работает. Это потому, что import youpackage
не означает чтение текущего рабочего каталога для каталога с именем «yourpackage», это означает поиск в текущем sys.modules
ключа «yourpackage» и затем выполнение различных действий, если это не так. там. Так что это всегда работает, когда вы делаете python setup.py
, потому что у вас есть свежий, пустой sys.modules
, но это не работает в целом.
Например, что если py2exe выполняет ваш setup.py как часть процесса упаковки приложения? Я видел такой случай, когда py2exe помещал неправильный номер версии в пакет, потому что пакет получал свой номер версии из import myownthing
в своем файле setup.py, но другая версия этого пакета ранее была импортирована во время py2exe запускается. Аналогичным образом, что если setuptools, easy_install, distribution или distutils2 пытаются собрать ваш пакет как часть процесса установки другого пакета, который зависит от вашего? Затем, будет ли ваш пакет импортируемым во время оценки его setup.py, или уже существует версия вашего пакета, которая была импортирована в течение жизни этого интерпретатора Python, или для импорта вашего пакета сначала должны быть установлены другие пакеты. или имеет побочные эффекты, может изменить результаты. У меня было несколько попыток повторно использовать пакеты Python, что вызывало проблемы для таких инструментов, как py2exe и setuptools, потому что их setup.py импортирует сам пакет, чтобы найти его номер версии.
Кстати, эта техника прекрасно работает с инструментами для автоматического создания файла yourpackage/_version.py
для вас, например, путем чтения вашей истории контроля версий и записи номера версии на основе самого последнего тега в истории контроля версий. Вот инструмент, который делает это для darcs: http://tahoe -lafs.org / trac / darcsver / browser / trunk / README.rst и вот фрагмент кода, который делает то же самое для git: http://github.com/warner/python-ecdsa/blob/0ed702a9d4057ecf33eea969b8cf280eaccd89a1/setup.py#L34