configs/arch-config/.config/calibre/plugins/DeACSM/modules/asn1crypto/dev/python-install.py

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