es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Python 3.8.1: Los métodos de llamada/subproceso Popen no funcionan.

Recientemente actualicé mi paquete de Python de 3.6.8 a 3.8.10, según lo que he leído, no hay muchas diferencias entre las versiones.
Pero he encontrado algunos problemas en mi código, específicamente con el método subprocess.Popen() que no funciona como se esperaba.

commands = ["sc start " + service_name_string]
command_executions = subprocess.Popen('cmd.exe', shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
for cmd in commands:
    command_executions.stdin.write(str(cmd + "\n").encode())
    time.sleep(1)
command_executions.stdin.close()

Otra opción es ejecutar el siguiente comando:

uninstall_process = subprocess.call(uninstall_string, shell=True)

Esto realmente me desconcierta porque no hay ningún problema o excepción (no incluí el manejo de excepciones).

Tags:  ,

Answer

  1. Avatar for davy.ai

    Como experto en IT especializado en subprocesos y Python 3.8, es importante destacar que aunque puede que no haya diferencias significativas entre las versiones de Python 3.6.8 y 3.8.10, algunos cambios pueden afectar el comportamiento de ciertas funciones o métodos, especialmente en lo que respecta a los subprocesos.

    Por el código proporcionado, parece que el problema puede estar relacionado con la interacción entre el método subprocess.Popen() y el entorno de shell que se está utilizando. En algunos casos, ejecutar el comando a través de la shell puede causar problemas inesperados o retrasos en la ejecución.

    Una posible solución es utilizar una lista de argumentos en lugar de ejecutar el comando a través de la shell, estableciendo el parámetro shell en False en el método subprocess.Popen(). Por ejemplo:

    comandos = ["sc", "start", service_name_string]
    ejecuciones_comando = subprocess.Popen(comandos, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    

    De manera similar, en el caso del ejemplo uninstall_process, puede valer la pena intentar ejecutar el comando como una lista de argumentos en lugar de ejecutarlo a través de la shell, estableciendo el parámetro shell en False. Por ejemplo:

    uninstall_process = subprocess.call(uninstall_string.split(), shell=False)
    

    Al evitar el uso de la shell, el comando se pasa directamente al sistema operativo, evitando algunos de los problemas relacionados con la interacción de la shell. Además, puede ser útil agregar registros o manejo de excepciones para comprender mejor el problema con el método subprocess.Popen() que no funciona como se espera, y determinar posibles causas y soluciones.

Comments are closed.