Python trae consigo un módulo para distribuir paquetes escritos en python, incluidas sus extensiones. Distutils es muy potente porque, como uno puede intuir por su nombre, sirve para crear paquetes de redistribución sea cual sea el sistema operativo de destino. Si bien generar instaladores para linux es sencillo porque al final quien termina encargándose de todo es la distribución, en windows es necesario crear los enlaces en el menú inicio y quizás en el escritorio.
Lo importante de estos enlaces, más que el hecho de crearlos, es que se borren al desinstalar el paquete. Para ello se debe crear un script de postinstalación y hacer que distutils sea consciente de su existencia. Un ejemplo de script sería el siguiente al quie llamaremos por ejemplo postinstall.py:
import sys
import os
from distutils import sysconfigdef getProgramsMenuPath():
"""getProgramsMenuPath() -> String|None
@return the filesystem location of the common Start Menu.
"""
return get_special_folder_path("CSIDL_PROGRAMS")def install():
"""@return a list of files/directories created"""
files_created=[]
if sys.platform != "win32":
pass
else:
menu_path=os.path.join(getProgramsMenuPath(),'Bcura')
os.mkdir(menu_path)
directory_created(menu_path)
script_path=os.path.join(sysconfig.get_config_var("prefix"),
'Scripts','main.py')
create_shortcut(script_path,
'Programa Bcura',
os.path.join(menu_path,'bcura.lnk'),
get_special_folder_path("CSIDL_DESKTOPDIRECTORY"))
file_created(os.path.join(menu_path,'bcura.lnk'))def remove():
passdef run(argv=sys.argv):
if argv[1] == "-install":
whocares=install()
elif argv[1] == "-remove":
remove()
else:
sys.stderr.write("This script is meant to be run by the Windows \
installer, not directly from the command line.\n")if __name__=='__main__':
run()
El script debe estar también dentro del archivo setup.py para que se instale junto al paquete y python pueda encontrarlo durante la instalación. El archivo setup.py sería:
# -*- coding: utf-8 -*-
#!/usr/bin/env python
from distutils.core import setup
setup(name="bcura",
version="0.1",
description=u"Aplicacion para el diseno de calderas",
author="Guillem Borrell, ETSI Aeronauticos, CFD Lab",
author_email="guillem@torroja.dmt.upm.es",
py_modules=['bcura','codata','constants',
'tablas','ui_main','water'],
scripts=['main.py','postinstall.py']
)
Finalmente, al crear el instalador para windows:
python setup.py bdist_wininst --install-script=postinstall.py