Escribí un script de inicialización que establece las variables de entorno del usuario, que son claves que se han cifrado y cifrado ... Una vez que se han creado las claves, el archivo exe de cifrado de claves ya no es necesario. Quiero iniciar la aplicación principal y eliminar el archivo de inicio que contiene las funciones de cifrado de claves y hash.

No tengo ningún problema con ninguno de los anteriores ... Todo funciona como debería cuando son independientes entre sí. El problema es que para que la aplicación principal tenga acceso a las variables de entorno recién creadas, necesito que el script de inicio se cierre por completo ...

Todo lo que he probado, Popen con banderas, os.system () y otros todavía me han dejado en una situación en la que el proceso padre termina y la aplicación principal se inicia, sin embargo, las variables de entorno no se han actualizado ... cierro y reinicio main .py y ... boom, el programa ve las variables actualizadas y todo está bien.

Todo lo que quiero es que se ejecute el script de inicio, generar un nuevo proceso que no esté vinculado en absoluto con init.py y luego salir para que pueda ser eliminado. Pensé que esto sería simple, pero después de muchas horas de rascarme la cabeza y probar numerosas cosas, todavía no estoy más cerca.

Si tengo que hacerlo, simplemente lo agruparé como dos archivos .exe separados, pero quería que fuera un tipo de instalación con un solo clic.

Estoy ejecutando Windows 10 y esto puede ser específico de la plataforma.

Enlaces examinados:

¿Cómo detener / terminar la ejecución de un script de Python?

Usar una llamada de subproceso de Python para invocar un script de Python

Comenzando un proceso separado

https://docs.python.org/2/library/subprocess.html

Python: cómo iniciar un proceso completo, no un proceso secundario, y recuperar el PID

Y más...

Resultado más cercano actual

p = Popen(["python","UserInterface.py"], stdin=PIPE, stdout=PIPE, stderr=PIPE,
      creationflags=DETACHED_PROCESS | CREATE_NEW_PROCESS_GROUP)
0
Paul Hashmi 10 oct. 2019 a las 06:05

1 respuesta

La mejor respuesta

Cree un bloque de entorno, establezca la variable de entorno con SetEnvironmentVariable y use CreateProcess para especificar este bloque de entorno para el proceso creado.

DOC de MSDN:

Para especificar un entorno diferente para un proceso, cree un nuevo bloque de entorno y pasarle el puntero como parámetro al Función CreateProcess.

...

Para agregar o modificar variables de entorno del sistema mediante programación, agregue ellos al HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment clave de registro, luego transmite una WM_SETTINGCHANGE mensaje con lParam establecido en la cadena "Entorno". Esto permite aplicaciones, como el shell, para recoger sus actualizaciones.

1
Drake Wu 11 oct. 2019 a las 05:43