78 lines
2.0 KiB
Python
78 lines
2.0 KiB
Python
# 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
|