← retour aux snippets

subprocess: terminer un groupe de processus proprement

Lancer un processus dans son propre groupe et l'arrêter avec signal (Unix/Windows).

objectif

Lancer un processus dans son propre groupe et l’arrêter avec signal (Unix/Windows).

code minimal

import subprocess, sys, os, time, signal
if os.name == "posix":
    p = subprocess.Popen([sys.executable, "-c", "import time; time.sleep(1)"], preexec_fn=os.setsid)
    os.killpg(p.pid, signal.SIGTERM)
    print(True)  # attendu: True
else:
    CREATE_NEW_PROCESS_GROUP = 0x00000200
    p = subprocess.Popen([sys.executable, "-c", "import time; time.sleep(1)"], creationflags=CREATE_NEW_PROCESS_GROUP)
    p.terminate()
    print(True)

utilisation

import subprocess, sys
p = subprocess.Popen([sys.executable, "-c", "print('x')"])
code = p.wait()
print(code == 0)

variante(s) utile(s)

import subprocess, sys
p = subprocess.Popen([sys.executable, "-c", "import time; time.sleep(0.01)"])
p.terminate(); p.wait(timeout=1.0)
print(p.returncode is not None)

notes

  • Sur Unix, démarrez un groupe (setsid) puis envoyez le signal au groupe.
  • Sur Windows, utilisez creationflags et p.terminate() pour stopper le processus.