5

He estado buscando una manera de empezar y terminar una prolongada "batch" en Python mediante programación. En este momento estoy usando "os.system()" para iniciar un trabajo por lotes de larga ejecución dentro de cada proceso hijo. Como habrás adivinado, "os.system()" genera un nuevo proceso dentro de ese proceso hijo (¿proceso de nieto?), Por lo que no puedo eliminar el trabajo por lotes del proceso de gran padre. Para dar una visualización de lo que acabo de describir:ejecución y terminación de un proceso por lotes de larga duración en Python

Main (grandparent) process, with PID = AAAA 
      | 
      |------> child process with PID = BBBB 
         | 
         |------> os.system("some long-running batch file) 
            [grandchild process, with PID = CCCC] 

Por lo tanto, mi problema es que no puedo matar el proceso nieto del abuelo ...

Mi pregunta es, ¿hay una manera de iniciar una trabajo por lotes de larga ejecución dentro de un proceso hijo, y poder matar ese trabajo por lotes simplemente terminando el proceso secundario? ¿Cuáles son las alternativas a os.system() que puedo usar para poder eliminar el trabajo por lotes del proceso principal?

Gracias!

Respuesta

2

Si se encuentra en un sistema compatible con Posix (por ejemplo, Linux u OS X) y no se debe ejecutar ningún código Python después del proceso secundario, use os.execv. En general, evite os.system y use el módulo subprocess en su lugar.

-1

Si desea control sobre inicio y parada de procesos hijo que tiene que utilizar el roscado. En ese caso, no busque más que el módulo threading de Python.

módulo
3

subprocess es la forma correcta para desovar y control de procesos en Python.

de los documentos:

módulo El subproceso que permite a nuevos procesos de regeneración, conectarse a sus tuberías de entrada/salida/error y obtener sus códigos de retorno. Este módulo tiene la intención de sustituir a varios otros, módulos y funciones mayores, tales como:

os.system
os.spawn
os.popen
popen2
comandos

por lo

.. Si está en Python 2.4+, subprocess es el reemplazo de os.system

para detener procesos, consulte fuera de los métodos terminate() y communicate() de Popen objetos.

Cuestiones relacionadas