Solución:
Pregunta: … una forma de comprobar si un proceso aún se está ejecutando …
Puedes hacerlo por ejemplo:
p = subprocess.Popen(...
"""
A None value indicates that the process hasn't terminated yet.
"""
poll = p.poll()
if poll is None:
# p.subprocess is alive
Python »3.6.1 Documentación popen-objects
Probado con Python: 3.4.2
Haciendo el
myProcessIsRunning = poll() is None
Como sugiere la respuesta principal, es la forma recomendada y la forma más sencilla de verificar si un proceso se está ejecutando. (y también funciona en jython)
Si no tiene la instancia de proceso a mano, verifíquela. Luego use los procesos TaskList / Ps del sistema operativo.
En Windows, mi comando se verá de la siguiente manera:
filterByPid = "PID eq %s" % pid
pidStr = str(pid)
commandArguments = ['cmd', '/c', "tasklist", "/FI", filterByPid, "|", "findstr", pidStr ]
Básicamente, esto hace lo mismo que la siguiente línea de comando:
cmd /c "tasklist /FI "PID eq 55588" | findstr 55588"
Y en Linux, hago exactamente lo mismo usando:
pidStr = str(pid)
commandArguments = ['ps', '-p', pidStr ]
El comando ps ya devolverá el código de error 0/1 dependiendo de si se encuentra el proceso. Mientras está en Windows, necesita el comando buscar cadena.
Este es el mismo enfoque que se analiza en el siguiente hilo de desbordamiento de pila:
Verifique si un proceso se está ejecutando usando su PID en JAVA
NOTA: Si usa este enfoque, recuerde envolver su llamada de comando en un try / except:
try:
foundRunningProcess = subprocess.check_output(argumentsArray, **kwargs)
return True
except Exception as err:
return False
Tenga en cuenta que tenga cuidado si está desarrollando con VS Code y utilizando Python y Jython puros. En mi entorno, tenía la ilusión de que el método poll () no funcionaba porque un proceso que sospechaba que debía haber terminado se estaba ejecutando. Este proceso había lanzado Wildfly. Y después de haber pedido que se detuviera wildfly, el shell todavía estaba esperando que el usuario “Presione cualquier tecla para continuar …”.
Para finalizar este proceso, en python puro funcionaba el siguiente código:
process.stdin.write(os.linesep)
En jython, tuve que arreglar este código para que tuviera el siguiente aspecto:
print >>process.stdin, os.linesep
Y con esta diferencia el proceso sí terminó. Y el jython.poll () comenzó a decirme que el proceso ha terminado.