How to create a shortcut in startmenu using setuptools windows installer

前端 未结 3 2118
说谎
说谎 2021-02-15 23:13

I want to create a start menu or Desktop shortcut for my Python windows installer package. I am trying to follow https://docs.python.org/3.4/distutils/builtdist.html#the-postins

3条回答
  •  暗喜
    暗喜 (楼主)
    2021-02-15 23:51

    Like others have commented here and elsewhere the support functions don't seem to work at all (at least not with setuptools). After a good day's worth of searching through various resources I found a way to create at least the Desktop shortcut. I'm sharing my solution (basically an amalgam of code I found here and here). I should add that my case is slightly different from yasar's, because it creates a shortcut to an installed package (i.e. an .exe file in Python's Scripts directory) instead of a script.

    In short, I added a post_install function to my setup.py, and then used the Python extensions for Windows to create the shortcut. The location of the Desktop folder is read from the Windows registry (there are other methods for this, but they can be unreliable if the Desktop is at a non-standard location).

    #!/usr/bin/env python
    
    import os
    import sys
    import sysconfig
    if sys.platform == 'win32':
        from win32com.client import Dispatch
        import winreg
    
    def get_reg(name,path):
        # Read variable from Windows Registry
        # From https://stackoverflow.com/a/35286642
        try:
            registry_key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, path, 0,
                                           winreg.KEY_READ)
            value, regtype = winreg.QueryValueEx(registry_key, name)
            winreg.CloseKey(registry_key)
            return value
        except WindowsError:
            return None
    
    def post_install():
        # Creates a Desktop shortcut to the installed software
    
        # Package name
        packageName = 'mypackage'
    
        # Scripts directory (location of launcher script)
        scriptsDir = sysconfig.get_path('scripts')
    
        # Target of shortcut
        target = os.path.join(scriptsDir, packageName + '.exe')
    
        # Name of link file
        linkName = packageName + '.lnk'
    
        # Read location of Windows desktop folder from registry
        regName = 'Desktop'
        regPath = r'Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders'
        desktopFolder = os.path.normpath(get_reg(regName,regPath))
    
        # Path to location of link file
        pathLink = os.path.join(desktopFolder, linkName)
        shell = Dispatch('WScript.Shell')
        shortcut = shell.CreateShortCut(pathLink)
        shortcut.Targetpath = target
        shortcut.WorkingDirectory = scriptsDir
        shortcut.IconLocation = target
        shortcut.save()
    
    setup(name='mypackage',
          ...,
          ...)
    
    if sys.argv[1] == 'install' and sys.platform == 'win32':
        post_install()
    

    Here's a link to a full setup script in which I used this:

    https://github.com/KBNLresearch/iromlab/blob/master/setup.py

提交回复
热议问题