# HG changeset patch # User Gregory Szorc # Date 1551984599 28800 # Node ID 7d121116886378cf0aa6d7addaaae9fc7082b5e5 # Parent 5e923355c595b77f58cbdb0f8c3f147f9a2ce8cc packaging: extract python exe info to own function This is generic functionality. We'll need it for WIX. As part of the port, we expose the full version and return the data as a dict. Differential Revision: https://phab.mercurial-scm.org/D6090 diff -r 5e923355c595 -r 7d1211168863 contrib/packaging/hgpackaging/inno.py --- a/contrib/packaging/hgpackaging/inno.py Thu Mar 07 10:36:20 2019 -0800 +++ b/contrib/packaging/hgpackaging/inno.py Thu Mar 07 10:49:59 2019 -0800 @@ -19,14 +19,10 @@ extract_tar_to_directory, extract_zip_to_directory, find_vc_runtime_files, + python_exe_info, ) -PRINT_PYTHON_INFO = ''' -import platform, sys; print("%s:%d" % (platform.architecture()[0], sys.version_info[0])) -'''.strip() - - def build(source_dir: pathlib.Path, build_dir: pathlib.Path, python_exe: pathlib.Path, iscc_exe: pathlib.Path, version=None): @@ -50,23 +46,18 @@ # architecture. vc_x64 = r'\x64' in os.environ['LIB'] - res = subprocess.run( - [str(python_exe), '-c', PRINT_PYTHON_INFO], - capture_output=True, check=True) - - py_arch, py_version = res.stdout.decode('utf-8').split(':') - py_version = int(py_version) + py_info = python_exe_info(python_exe) if vc_x64: - if py_arch != '64bit': + if py_info['arch'] != '64bit': raise Exception('architecture mismatch: Visual C++ environment ' 'is configured for 64-bit but Python is 32-bit') else: - if py_arch != '32bit': + if py_info['arch'] != '32bit': raise Exception('architecture mismatch: Visual C++ environment ' 'is configured for 32-bit but Python is 64-bit') - if py_version != 2: + if py_info['py3']: raise Exception('Only Python 2 is currently supported') build_dir.mkdir(exist_ok=True) diff -r 5e923355c595 -r 7d1211168863 contrib/packaging/hgpackaging/util.py --- a/contrib/packaging/hgpackaging/util.py Thu Mar 07 10:36:20 2019 -0800 +++ b/contrib/packaging/hgpackaging/util.py Thu Mar 07 10:49:59 2019 -0800 @@ -7,8 +7,10 @@ # no-check-code because Python 3 native. +import distutils.version import os import pathlib +import subprocess import tarfile import zipfile @@ -46,3 +48,26 @@ d / 'msvcr90.dll', winsxs / 'Manifests' / ('%s.manifest' % version), ] + + +PRINT_PYTHON_INFO = ''' +import platform; print("%s:%s" % (platform.architecture()[0], platform.python_version())) +'''.strip() + + +def python_exe_info(python_exe: pathlib.Path): + """Obtain information about a Python executable.""" + + res = subprocess.run( + [str(python_exe), '-c', PRINT_PYTHON_INFO], + capture_output=True, check=True) + + arch, version = res.stdout.decode('utf-8').split(':') + + version = distutils.version.LooseVersion(version) + + return { + 'arch': arch, + 'version': version, + 'py3': version >= distutils.version.LooseVersion('3'), + }