| # -*- coding: utf-8 -*- |
| """ |
| patchlevel.py |
| ~~~~~~~~~~~~~ |
| |
| Extract version info from Include/patchlevel.h. |
| Adapted from Doc/tools/getversioninfo. |
| |
| :copyright: 2007-2008 by Georg Brandl. |
| :license: Python license. |
| """ |
| |
| import os |
| import re |
| import sys |
| |
| def get_header_version_info(srcdir): |
| patchlevel_h = os.path.join(srcdir, '..', 'Include', 'patchlevel.h') |
| |
| # This won't pick out all #defines, but it will pick up the ones we |
| # care about. |
| rx = re.compile(r'\s*#define\s+([a-zA-Z][a-zA-Z_0-9]*)\s+([a-zA-Z_0-9]+)') |
| |
| d = {} |
| f = open(patchlevel_h) |
| try: |
| for line in f: |
| m = rx.match(line) |
| if m is not None: |
| name, value = m.group(1, 2) |
| d[name] = value |
| finally: |
| f.close() |
| |
| release = version = '%s.%s' % (d['PY_MAJOR_VERSION'], d['PY_MINOR_VERSION']) |
| micro = int(d['PY_MICRO_VERSION']) |
| if micro != 0: |
| release += '.' + str(micro) |
| |
| level = d['PY_RELEASE_LEVEL'] |
| suffixes = { |
| 'PY_RELEASE_LEVEL_ALPHA': 'a', |
| 'PY_RELEASE_LEVEL_BETA': 'b', |
| 'PY_RELEASE_LEVEL_GAMMA': 'rc', |
| } |
| if level != 'PY_RELEASE_LEVEL_FINAL': |
| release += suffixes[level] + str(int(d['PY_RELEASE_SERIAL'])) |
| return version, release |
| |
| |
| def get_sys_version_info(): |
| major, minor, micro, level, serial = sys.version_info |
| release = version = '%s.%s' % (major, minor) |
| if micro: |
| release += '.%s' % micro |
| if level != 'final': |
| release += '%s%s' % (level[0], serial) |
| return version, release |
| |
| |
| def get_version_info(): |
| try: |
| return get_header_version_info('.') |
| except (IOError, OSError): |
| version, release = get_sys_version_info() |
| print >>sys.stderr, 'Can\'t get version info from Include/patchlevel.h, ' \ |
| 'using version of this interpreter (%s).' % release |
| return version, release |
| |
| if __name__ == '__main__': |
| print get_header_version_info('.')[1] |