# coding: utf-8 from __future__ import unicode_literals, division, absolute_import, print_function import os import shutil import subprocess import sys from urllib.parse import urlparse from urllib.request import urlopen run_args = [ { 'name': 'version', 'kwarg': 'version', }, { 'name': 'arch', 'kwarg': 'arch', }, ] def run(version=None, arch=None): """ Installs a version of Python on Windows :return: A bool - if Python was installed successfully """ if sys.platform != 'win32': raise ValueError('python-install is only designed for Windows') if version not in set(['2.6', '3.3']): raise ValueError('Invalid version: %r' % version) if arch not in set(['x86', 'x64']): raise ValueError('Invalid arch: %r' % arch) if version == '2.6': if arch == 'x64': url = 'https://www.python.org/ftp/python/2.6.6/python-2.6.6.amd64.msi' else: url = 'https://www.python.org/ftp/python/2.6.6/python-2.6.6.msi' else: if arch == 'x64': url = 'https://www.python.org/ftp/python/3.3.5/python-3.3.5.amd64.msi' else: url = 'https://www.python.org/ftp/python/3.3.5/python-3.3.5.msi' home = os.environ.get('USERPROFILE') msi_filename = os.path.basename(urlparse(url).path) msi_path = os.path.join(home, msi_filename) install_path = os.path.join(os.environ.get('LOCALAPPDATA'), 'Python%s-%s' % (version, arch)) if os.path.exists(os.path.join(install_path, 'python.exe')): print(install_path) return True try: with urlopen(url) as r, open(msi_path, 'wb') as f: shutil.copyfileobj(r, f) proc = subprocess.Popen( 'msiexec /passive /a %s TARGETDIR=%s' % (msi_filename, install_path), shell=True, cwd=home ) proc.communicate() finally: if os.path.exists(msi_path): os.unlink(msi_path) print(install_path) return True