Me está costando conseguir lo que quiero del módulo de subproceso python (lo que supone una abstracción unificada/independiente de plataforma, afaik, pero don 'Empezaré con eso :)).subproceso python con shell = Verdadero: redirecciones y subproceso independiente de plataforma que mata
Así que lo simple que estoy buscando es lo siguiente. Quiero
- Inicio de una aplicación (stdio) externo (posiblemente con subproceso), donde uso redirecciones de estilo concha (como './myapp> stdout_log> stderr_log')
- Básicamente quiero ejecutar una línea de comandos shell, así que tengo que especificar shell = True para subprocess.Popen() (o bien cambios de dirección en la línea de comandos no funcionarán)
- que quiere poner en marcha esta línea de comandos de manera asíncrona (por lo tanto, se ejecuta como un subproceso independiente, pero mi proceso de python ess no esperará a su finalización)
- (Mi proceso principal de python miraría los registros del proceso secundario de vez en cuando para extraer información, pero esto es irrelevante para la pregunta)
- Si mi proceso padre python decide, debería poder terminar este proceso hijo.
Ahora, mis principales problemas son que
- básicamente estoy obligado a utilizar shell = True, para conseguir cambios de dirección para trabajar
- Procesamiento del niño stdout/stderr en el pitón de los padres proceso no es una opción, ya que no pude encontrar la funcionalidad para hacerlo sin esperar (y el proceso padre python debe hacer otras cosas mientras el hijo está ejecutándose)
- Si uso shell = True continuación subprocess.kill() sólo se pondrá fin a la cáscara, pero no el proceso hijo
- que había necesidad de un método fiable proceso hijo terminación que funciona en cualquier plataforma (pero por lo menos Linux y Windows)
Espero haber sido lo suficientemente específico. Gracias por todas las sugerencias/consejos de antelación - acabo de pasar un día entero con sub-proceso, y en mi humilde opinión es
un dolor
lejos de cualquiera de plataforma independiente o simples :((pero tal vez sea sólo yo)
ACTUALIZACIÓN (2010 -10-13):
Si inicia un subproceso (incluso con shell = False), la función subprocess.Popen.kill() solo matará ese subproceso (por lo tanto, si hay algún "nieto") "procesos, no van a ser terminados)
leí sobre el uso del parámetro preexec_fn para establecer el SID en todos los procesos secundarios, pero es sólo UNIX:. timeout a subprocess
Relacionado: [Cómo finalizar un subproceso de python iniciado con shell = True] (http://stackoverflow.com/q/4789837/95735) –