import os import subprocess import shutil import time import _winreg def safe_rmtree(path): try: if os.path.exists(path): shutil.rmtree( path, ignore_errors=True ) except: pass def delete_reg_tree(root, path): try: key = _winreg.OpenKey( root, path, 0, _winreg.KEY_ALL_ACCESS ) except: return while True: try: sub = _winreg.EnumKey( key, 0 ) delete_reg_tree( root, path + "\\" + sub ) except: break try: _winreg.CloseKey(key) except: pass try: _winreg.DeleteKey(root, path) except: pass def remove_rstudio_reg(): locations = [ r"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall", r"SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall" ] for root in ( _winreg.HKEY_LOCAL_MACHINE, _winreg.HKEY_CURRENT_USER ): for base in locations: try: key = _winreg.OpenKey( root, base ) except: continue i = 0 while True: try: sub = _winreg.EnumKey( key, i ) i += 1 except: break sub_path = base + "\\" + sub try: sk = _winreg.OpenKey( root, sub_path ) name, _ = _winreg.QueryValueEx( sk, "DisplayName" ) _winreg.CloseKey(sk) if ( "RStudio" in name or "Posit" in name ): delete_reg_tree( root, sub_path ) except: pass try: _winreg.CloseKey(key) except: pass def rstudio_exists(): paths = [ r"C:\Program Files\RStudio", r"C:\Program Files\Posit", r"C:\Program Files (x86)\RStudio", r"C:\Program Files (x86)\Posit" ] for p in paths: if os.path.exists(p): return True return False def spm_install(dir, args): try: os.chdir(dir) ret = subprocess.call( args, shell=True ) print "retcode" + str(ret) + "retcode" except: print "retcode1retcode" def spm_uninstall(dir, args): try: subprocess.call( 'taskkill /F /IM rstudio.exe', shell=True ) except: pass try: subprocess.call( 'taskkill /F /IM rsession.exe', shell=True ) except: pass uninstallers = [ r"C:\Program Files\RStudio\Uninstall.exe", r"C:\Program Files\Posit\Uninstall.exe", r"C:\Program Files (x86)\RStudio\Uninstall.exe", r"C:\Program Files (x86)\Posit\Uninstall.exe" ] for uninstaller in uninstallers: try: if os.path.exists(uninstaller): ret = subprocess.call( [uninstaller, "/S"], shell=False ) print "retcode" + str(ret) + "retcode" time.sleep(15) except: pass folders = [ r"C:\Program Files\RStudio", r"C:\Program Files\Posit", r"C:\Program Files (x86)\RStudio", r"C:\Program Files (x86)\Posit" ] for f in folders: safe_rmtree(f) try: users = r"C:\Users" for u in os.listdir(users): safe_rmtree( os.path.join( users, u, r"AppData\Local\Programs\RStudio" ) ) safe_rmtree( os.path.join( users, u, r"AppData\Local\Programs\Posit" ) ) except: pass remove_rstudio_reg() time.sleep(5) if rstudio_exists(): print "retcode1retcode" else: print "retcode0retcode" def spm_update(dir, args): try: os.chdir(dir) ret = subprocess.call( args, shell=True ) print "retcode" + str(ret) + "retcode" except: print "retcode1retcode"