| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387 |
- # -*- coding: utf-8 -*-
- #
- # Copyright © 2012 Pierre Raybaut
- # Licensed under the terms of the MIT License
- # (see winpython/__init__.py for details)
- """
- Register a Python distribution
- Created on Tue Aug 21 21:46:30 2012
- """
- from __future__ import print_function
- import sys
- import os
- import os.path as osp
- import subprocess
- # Local imports
- from winpython.py3compat import winreg
- from winpython import utils
- KEY_C = r"Software\Classes\%s"
- KEY_C0 = KEY_C % r"Python.%sFile\shell"
- KEY_C1 = KEY_C % r"Python.%sFile\shell\%s"
- KEY_C2 = KEY_C1 + r"\command"
- KEY_DROP0 = KEY_C % r"Python.%sFile\shellex"
- KEY_DROP1 = KEY_C % r"Python.%sFile\shellex\DropHandler"
- KEY_I = KEY_C % r"Python.%sFile\DefaultIcon"
- KEY_D = KEY_C % r"Python.%sFile"
- EWI = "Edit with IDLE"
- EWS = "Edit with Spyder"
- KEY_S = r"Software\Python"
- KEY_S0 = KEY_S + r"\PythonCore"
- KEY_S1 = KEY_S0 + r"\%s"
- def _get_shortcut_data(target, current=True):
- wpgroup = utils.create_winpython_start_menu_folder(
- current=current
- )
- wpdir = osp.join(target, os.pardir)
- data = []
- for name in os.listdir(wpdir):
- bname, ext = osp.splitext(name)
- if ext == '.exe':
- data.append(
- (
- osp.join(wpdir, name),
- bname,
- osp.join(wpgroup, bname),
- )
- )
- return data
- def register(target, current=True):
- """Register a Python distribution in Windows registry"""
- root = (
- winreg.HKEY_CURRENT_USER
- if current
- else winreg.HKEY_LOCAL_MACHINE
- )
- # Extensions
- winreg.SetValueEx(
- winreg.CreateKey(root, KEY_C % ".py"),
- "",
- 0,
- winreg.REG_SZ,
- "Python.File",
- )
- winreg.SetValueEx(
- winreg.CreateKey(root, KEY_C % ".pyw"),
- "",
- 0,
- winreg.REG_SZ,
- "Python.NoConFile",
- )
- winreg.SetValueEx(
- winreg.CreateKey(root, KEY_C % ".pyc"),
- "",
- 0,
- winreg.REG_SZ,
- "Python.CompiledFile",
- )
- winreg.SetValueEx(
- winreg.CreateKey(root, KEY_C % ".pyo"),
- "",
- 0,
- winreg.REG_SZ,
- "Python.CompiledFile",
- )
- # MIME types
- winreg.SetValueEx(
- winreg.CreateKey(root, KEY_C % ".py"),
- "Content Type",
- 0,
- winreg.REG_SZ,
- "text/plain",
- )
- winreg.SetValueEx(
- winreg.CreateKey(root, KEY_C % ".pyw"),
- "Content Type",
- 0,
- winreg.REG_SZ,
- "text/plain",
- )
- # Verbs
- python = osp.abspath(osp.join(target, 'python.exe'))
- pythonw = osp.abspath(osp.join(target, 'pythonw.exe'))
- spyder = osp.abspath(
- osp.join(target, os.pardir, 'Spyder.exe')
- )
- if not osp.isfile(spyder):
- spyder = '%s" "%s\Scripts\spyder' % (
- pythonw,
- target,
- )
- winreg.SetValueEx(
- winreg.CreateKey(root, KEY_C2 % ("", "open")),
- "",
- 0,
- winreg.REG_SZ,
- '"%s" "%%1" %%*' % python,
- )
- winreg.SetValueEx(
- winreg.CreateKey(root, KEY_C2 % ("NoCon", "open")),
- "",
- 0,
- winreg.REG_SZ,
- '"%s" "%%1" %%*' % pythonw,
- )
- winreg.SetValueEx(
- winreg.CreateKey(
- root, KEY_C2 % ("Compiled", "open")
- ),
- "",
- 0,
- winreg.REG_SZ,
- '"%s" "%%1" %%*' % python,
- )
- winreg.SetValueEx(
- winreg.CreateKey(root, KEY_C2 % ("", EWI)),
- "",
- 0,
- winreg.REG_SZ,
- '"%s" "%s\Lib\idlelib\idle.pyw" -n -e "%%1"'
- % (pythonw, target),
- )
- winreg.SetValueEx(
- winreg.CreateKey(root, KEY_C2 % ("NoCon", EWI)),
- "",
- 0,
- winreg.REG_SZ,
- '"%s" "%s\Lib\idlelib\idle.pyw" -n -e "%%1"'
- % (pythonw, target),
- )
- winreg.SetValueEx(
- winreg.CreateKey(root, KEY_C2 % ("", EWS)),
- "",
- 0,
- winreg.REG_SZ,
- '"%s" "%%1"' % spyder,
- )
- winreg.SetValueEx(
- winreg.CreateKey(root, KEY_C2 % ("NoCon", EWS)),
- "",
- 0,
- winreg.REG_SZ,
- '"%s" "%%1"' % spyder,
- )
- # Drop support
- handler = "{60254CA5-953B-11CF-8C96-00AA00B8708C}"
- for ftype in ("", "NoCon", "Compiled"):
- winreg.SetValueEx(
- winreg.CreateKey(root, KEY_DROP1 % ftype),
- "",
- 0,
- winreg.REG_SZ,
- handler,
- )
- # Icons
- dlls = osp.join(target, 'DLLs')
- winreg.SetValueEx(
- winreg.CreateKey(root, KEY_I % ""),
- "",
- 0,
- winreg.REG_SZ,
- r'%s\py.ico' % dlls,
- )
- winreg.SetValueEx(
- winreg.CreateKey(root, KEY_I % "NoCon"),
- "",
- 0,
- winreg.REG_SZ,
- r'%s\py.ico' % dlls,
- )
- winreg.SetValueEx(
- winreg.CreateKey(root, KEY_I % "Compiled"),
- "",
- 0,
- winreg.REG_SZ,
- r'%s\pyc.ico' % dlls,
- )
- # Descriptions
- winreg.SetValueEx(
- winreg.CreateKey(root, KEY_D % ""),
- "",
- 0,
- winreg.REG_SZ,
- "Python File",
- )
- winreg.SetValueEx(
- winreg.CreateKey(root, KEY_D % "NoCon"),
- "",
- 0,
- winreg.REG_SZ,
- "Python File (no console)",
- )
- winreg.SetValueEx(
- winreg.CreateKey(root, KEY_D % "Compiled"),
- "",
- 0,
- winreg.REG_SZ,
- "Compiled Python File",
- )
- # PythonCore entries
- short_version = utils.get_python_infos(target)[0]
- long_version = utils.get_python_long_version(target)
- key_core = (KEY_S1 % short_version) + r'\%s'
- winreg.SetValueEx(
- winreg.CreateKey(root, key_core % 'InstallPath'),
- "",
- 0,
- winreg.REG_SZ,
- target,
- )
- winreg.SetValueEx(
- winreg.CreateKey(
- root, key_core % r'InstallPath\InstallGroup'
- ),
- "",
- 0,
- winreg.REG_SZ,
- "Python %s" % short_version,
- )
- winreg.SetValueEx(
- winreg.CreateKey(root, key_core % 'Modules'),
- "",
- 0,
- winreg.REG_SZ,
- "",
- )
- winreg.SetValueEx(
- winreg.CreateKey(root, key_core % 'PythonPath'),
- "",
- 0,
- winreg.REG_SZ,
- r"%s\Lib;%s\DLLs" % (target, target),
- )
- winreg.SetValueEx(
- winreg.CreateKey(
- root,
- key_core % r'Help\Main Python Documentation',
- ),
- "",
- 0,
- winreg.REG_SZ,
- r"%s\Doc\python%s.chm" % (target, long_version),
- )
- # Create start menu entries for all WinPython launchers
- for path, desc, fname in _get_shortcut_data(
- target, current=current
- ):
- utils.create_shortcut(path, desc, fname)
- # Register the Python ActiveX Scripting client (requires pywin32)
- axscript = osp.join(
- target,
- 'Lib',
- 'site-packages',
- 'win32comext',
- 'axscript',
- 'client',
- 'pyscript.py',
- )
- if osp.isfile(axscript):
- subprocess.call(
- '"%s" "%s"' % (python, axscript), cwd=target
- )
- else:
- print(
- 'Unable to register ActiveX: please install pywin32',
- file=sys.stderr,
- )
- def unregister(target, current=True):
- """Unregister a Python distribution in Windows registry"""
- # Registry entries
- root = (
- winreg.HKEY_CURRENT_USER
- if current
- else winreg.HKEY_LOCAL_MACHINE
- )
- short_version = utils.get_python_infos(target)[0]
- key_core = (KEY_S1 % short_version) + r'\%s'
- for key in (
- # Drop support
- KEY_DROP1 % "",
- KEY_DROP1 % "NoCon",
- KEY_DROP1 % "Compiled",
- KEY_DROP0 % "",
- KEY_DROP0 % "NoCon",
- KEY_DROP0 % "Compiled",
- # Icons
- KEY_I % "NoCon",
- KEY_I % "Compiled",
- KEY_I % "",
- # Edit with IDLE
- KEY_C2 % ("", EWI),
- KEY_C2 % ("NoCon", EWI),
- KEY_C1 % ("", EWI),
- KEY_C1 % ("NoCon", EWI),
- # Edit with Spyder
- KEY_C2 % ("", EWS),
- KEY_C2 % ("NoCon", EWS),
- KEY_C1 % ("", EWS),
- KEY_C1 % ("NoCon", EWS),
- # Verbs
- KEY_C2 % ("", "open"),
- KEY_C2 % ("NoCon", "open"),
- KEY_C2 % ("Compiled", "open"),
- KEY_C1 % ("", "open"),
- KEY_C1 % ("NoCon", "open"),
- KEY_C1 % ("Compiled", "open"),
- KEY_C0 % "",
- KEY_C0 % "NoCon",
- KEY_C0 % "Compiled",
- # Descriptions
- KEY_D % "NoCon",
- KEY_D % "Compiled",
- KEY_D % "",
- # PythonCore
- key_core % r'InstallPath\InstallGroup',
- key_core % 'InstallPath',
- key_core % 'Modules',
- key_core % 'PythonPath',
- key_core % r'Help\Main Python Documentation',
- key_core % 'Help',
- KEY_S1 % short_version,
- KEY_S0,
- KEY_S,
- ):
- try:
- print(key)
- winreg.DeleteKey(root, key)
- except WindowsError:
- rootkey = (
- 'HKEY_CURRENT_USER'
- if current
- else 'HKEY_LOCAL_MACHINE'
- )
- print(
- r'Unable to remove %s\%s' % (rootkey, key),
- file=sys.stderr,
- )
- # Start menu shortcuts
- for path, desc, fname in _get_shortcut_data(
- target, current=current
- ):
- if osp.exists(fname):
- os.remove(fname)
- if __name__ == '__main__':
- register(sys.prefix)
- unregister(sys.prefix)
|