Ejecutar aplicación o script al iniciar Windows



Versión: 2.6 – 3.x.

Se trata de una tarea sencilla. El procedimiento es el de crear un nuevo valor en el registro, en una ubicación determinada, en donde el sistema operativo podrá leer la ruta de nuestro script o aplicación y ejecutarla al iniciarse.

Para lograrlo, utilizaremos la API de Windows a través del paquete pywin32. Si aún no lo has instalado, puedes descargar los instaladores en el enlace anterior, según la arquitectura de tu ordenador y versión de Python. Una vez instalado, puedes comprobar ejecutando en la consola o shell de Python:

import pywin32

Las funciones de la API necesarias para llevar a cabo la tarea son:

Por lo tanto, comenzaremos importándolas desde el módulo win32api:

from win32api import (GetModuleFileName, RegCloseKey, RegDeleteValue,
                      RegOpenKeyEx, RegSetValueEx)

Nótese la función GetModuleFileName, que retorna la ruta completa de nuestro archivo y utilizaremos más adelante.

Además, serán necesarias algunas constantes para utilizar en las funciones anteriores.

from win32con import HKEY_LOCAL_MACHINE, KEY_WRITE, REG_SZ

La ruta de la clave en donde se guardan las aplicaciones que se ejecutan al iniciar Windows es HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run. En sistemas de 64 bits, generalmente éste se encargará de convertirla a su correspondiente (por ejemplo, HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run). Crearemos una constante que almacene dicho valor.

SUBKEY = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run"

Una vez hecho esto, comenzaremos con la primera función, a la que llamaremos run_at_startup_set, y se encargará de crear un valor con la ruta de nuestra aplicación o script en la ubicación que indicamos anteriormente.

def run_at_startup_set(appname, path):
    """
    Set the registry key to run at stratup.
    """

appname: nombre de nuestra apliación o script.
path: ruta completa del archivo a ejecutar.

    key = RegOpenKeyEx(HKEY_LOCAL_MACHINE, SUBKEY, 0, KEY_WRITE)

Abrimos la clave en la ruta establecida y con los privilegios necesarios para añadir valores.

    RegSetValueEx(key, appname, 0, REG_SZ, path)

Añadimos un nuevo valor con los datos de nuestra aplicación. REG_SZ indica que path finaliza con un carácter nulo. Recuerda que estas funciones son llamadas desde C/C++, y que pywin32 nos provee un wrapper en Python para las mismas.

    RegCloseKey(key)

Cerramos la clave para guardar los cambios.

La reciente función se utiliza, por ejemplo, de la siguiente manera:

run_at_startup_set("Recursos Python", r"C:\RecursosPython\rp.exe")

De esta manera se establece un valor en la clave el cual indica que C:\RecursosPython\rp.exe debe ejecutarse al iniciar Windows.

Vista previa

Para remover el valor establecido, crearemos la función run_at_startup_remove, que tomará como parámetro el nombre que le hemos dado a nuestra aplicación al llamar a run_at_startup_set.

def run_at_startup_remove(appname):
    """
    Removes the run-at-startup registry key.
    """

appname: nombre de nuestra aplicación o script.

    key = RegOpenKeyEx(HKEY_LOCAL_MACHINE, SUBKEY, 0, KEY_WRITE)

Abrimos nuevamente la clave con los privilegios necesarios para remover un valor.

    RegDeleteValue(key, appname)

Eliminamos el valor establecido anteriormente.

    RegCloseKey(key)

Guardamos los cambios.

Por último queda crear una función que ejecute un script utilizando el intérprete de Python actual.

def run_script_at_startup_set(appname, script):

El parámetro appname mantiene la misma funcionalidad en todas las funciones.
script: nombre o ruta del archivo .py.

    path = "%s %s" % (GetModuleFileName(0), script)

Crea la ruta pasando como argumento el nombre del script al intérprete actual.

    run_at_startup_set(appname, path)

Llama a la función original.

Ejemplo de uso:

run_script_at_startup_set("Reproducir audio", "audio.py")

Si este código se ejecuta en Python 2.7, se establecerá la ruta C:\Python27\python.exe audio.py. En Python 3.4, se establecerá C:\Python34\python.exe audio.py.

Código completo:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from win32api import (GetModuleFileName, RegCloseKey, RegDeleteValue,
                      RegOpenKeyEx, RegSetValueEx)
from win32con import HKEY_LOCAL_MACHINE, KEY_WRITE, REG_SZ


SUBKEY = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run"


def run_at_startup_set(appname, path):
    """
    Sets the registry key to run at stratup.
    """
    key = RegOpenKeyEx(HKEY_LOCAL_MACHINE, SUBKEY, 0, KEY_WRITE)
    RegSetValueEx(key, appname, 0, REG_SZ, path)
    RegCloseKey(key)


def run_script_at_startup_set(appname, script):
    path = "%s %s" % (GetModuleFileName(0), script)
    run_at_startup_set(appname, path)


def run_at_startup_remove(appname):
    """
    Removes the run-at-startup registry key.
    """
    key = RegOpenKeyEx(HKEY_LOCAL_MACHINE, SUBKEY, 0, KEY_WRITE)
    RegDeleteValue(key, appname)
    RegCloseKey(key)



Deja un comentario