import os from subprocess import PIPE, Popen import ctypes import ssl import urllib2 import datetime import time import shutil import re class disable_file_system_redirection: _disable = ctypes.windll.kernel32.Wow64DisableWow64FsRedirection _revert = ctypes.windll.kernel32.Wow64RevertWow64FsRedirection def __enter__(self): self.old_value = ctypes.c_long() self.success = self._disable(ctypes.byref(self.old_value)) def __exit__(self, type, value, traceback): if self.success: self._revert(self.old_value) with disable_file_system_redirection(): arch=os.popen("wmic os get OSArchitecture").read() userout = os.popen('query user').read() username = re.findall("(.*)Active",userout)[0].split()[0] sid = os.popen("wmic useraccount where name=\"%s\" get sid"%(username)).read().splitlines()[1].strip() if '64' in arch: url = "https://www.python.org/ftp/python/3.13.3/python-3.13.3-amd64.exe" regkey = "HKEY_USERS\%s\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\%s" else: url = "https://www.python.org/ftp/python/3.13.3/python-3.13.3.exe" regkey = "HKEY_USERS\%s\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\%s" Down_path=os.environ['TEMP'] fileName = url.split('/')[-1] DownTo = os.path.join(Down_path, fileName) def ecmd(command): from subprocess import Popen, PIPE import ctypes with disable_file_system_redirection(): obj = Popen(command, shell = True, stdout = PIPE, stderr = PIPE) out, err = obj.communicate() ret=obj.returncode if ret==0: if out: return out.strip() else: return ret else: if err: return err.strip() else: return ret def downloadFile(DownTo, fromURL): headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36'} context = ssl._create_unverified_context() request = urllib2.Request(fromURL, headers=headers) req = urllib2.urlopen(request,context=context) try: with open(DownTo, 'wb') as f: while True: chunk = req.read(100*1000*1000) if chunk: f.write(chunk) else: break if os.path.isfile(DownTo): return '{} - {}KB'.format(DownTo, os.path.getsize(DownTo)/1024) except: return 'Please Check URL or Download Path!' regname = "python.reg" reg_path=os.path.join(os.environ['TEMP'], regname) def spm_install(dir, args): with disable_file_system_redirection(): os.popen('RD /S /Q %s'%(Down_path)) if not os.path.exists(Down_path): os.mkdir(Down_path) print(downloadFile(DownTo, url)) latest_version = os.popen('wmic datafile where name="%s" get Version /value'%("\\\\".join(DownTo.split('\\')))).read().strip().split("=")[-1] os.environ["USERPROFILE"] = "C:\Users\%s"%(username) os.environ["USERNAME"] = "%s"%(username) os.environ["LOCALAPPDATA"] = "C:\Users\%s\AppData\Local"%(username) os.environ["APPDATA"] = "C:\Users\%s\AppData\Roaming"%(username) print(ecmd('"%s" /quiet InstallAllUsers=1 PrependPath=1 Include_launcher=0'%(DownTo))) query = os.popen('REG QUERY "HKEY_USERS\\.DEFAULT\\Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall"').read() for i in query.splitlines(): displayname = os.popen('REG QUERY "%s" /v DisplayName'%(i)).read() displayVersion = os.popen('REG QUERY "%s" /v DisplayVersion'%(i)).read() if 'python' in displayname.lower() and latest_version in displayVersion: guid = i.split('\\')[-1] break print(os.popen('reg export "HKEY_USERS\.DEFAULT\Software\Microsoft\Windows\CurrentVersion\Uninstall\%s" "%s" /y'%(guid,reg_path)).read()) print(os.popen('reg delete "HKEY_USERS\.DEFAULT\Software\Microsoft\Windows\CurrentVersion\Uninstall\%s" /f'%(guid)).read()) with open(reg_path, 'r') as f: content = f.read().decode('utf-16') new = re.sub("[[].*{.*}[]]", '[%s]'%(regkey%(sid,guid)), content) with open(reg_path, 'w') as f: f.write(new) print(os.popen('reg import "%s"'%(reg_path))) os.remove(DownTo) os.remove(reg_path) def spm_uninstall(dir, args): with disable_file_system_redirection(): if os.path.exists("C:\\Users\\%s\\AppData\\Local\\Package Cache"%(username)): for root, dirs, files in os.walk("C:\\Users\\%s\\AppData\\Local\\Package Cache"%(username)): flag = False if files: for i in files: if 'python' in i: print(ecmd('"%s" /uninstall /quiet'%(os.path.join(root,i)))) pythonid = root.split("\\")[-1] os.popen('reg delete "HKEY_USERS\%s\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\\%s" /f'%(sid,pythonid)) os.popen('reg delete "HKEY_USERS\%s\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\\%s" /f'%(sid,pythonid)) os.popen('RD /S /Q "%s"'%(root)) os.popen('RD /S /Q %s'%(Down_path)) flag=True break if flag: break def spm_update(dir, args): with disable_file_system_redirection(): spm_uninstall(None, None) time.sleep(20) spm_install(None, None)