I'm building an GUI program that will be used on Windows platform. I already accepted the fact that I will need three installers (Python, GTK stuff, and one for my package).
Now, I want my installer to place shiny little shortcut on my desktop. Here is the command to generate Window installer:
python setup.py egg_info -RDb "" bdist_wininst --install-script postinstall.py
egg_info -RDb will clear and developemnt tags from release name, so the output will be package-0.1 instead of package-0.1dev
bdist_wininst will invoke Windows Installer builder
--install-script postinstall.py commands that postinstall.py script mentioned in setup.py file will be used for post installation.
Here is the setup.py slice. Note that this script must lie in root of our package:
... setup(name='package', ... scripts=['postinstall.py'], ... )
And finally, the postinstall.py:
#! python # -*- coding: utf-8 -*- import os import sys import shutil import my_package DESKTOP_FOLDER = get_special_folder_path("CSIDL_DESKTOPDIRECTORY") NAME = 'program.lnk' if sys.argv == '-install': create_shortcut( os.path.join(sys.prefix, 'pythonw.exe'), # program 'Description of the shortcut', # description NAME, # filename mypackage.__file__, # parameters '', # workdir os.path.join(os.path.dirname(my_package.__file__), 'favicon.ico'), # iconpath ) # move shortcut from current directory to DESKTOP_FOLDER shutil.move(os.path.join(os.getcwd(), NAME), os.path.join(DESKTOP_FOLDER, NAME)) # tell windows installer that we created another # file which should be deleted on uninstallation file_created(os.path.join(DESKTOP_FOLDER, NAME)) if sys.argv == '-remove': pass # This will be run on uninstallation. Nothing to do.
 Note that I'm using some custom builtin functions, you can read more about here.
 I'm invoking pythonw.exe instead of python.exe because I don't want console to be visible (we are using GUI, remember).
 In __init__.py of the my_package, use the casual __name__ == '__main__' trick.