Jak zespawnować proces i wysłać do niego sygnał interrput

0

Jak stworzymy banalny program w pythonie i podczas jego działania (kiedy po prostu działa albo czeka na input) przerwiemy go, np wciskając Ctrl+C, to rzucany jest wyjątek KeyboardInterrupt który możemy albo złapać albo puścić dalej, i wtedy widzimy stacktrace.

Chcę zespawnować proces tak żeby właśnie wywołać takie wyprintowanie stacktrace'a. Miałem

from subprocess import run

try:
  return run(
    env=dict(environ, PYTHONPATH=project_path()),
    cwd=directory,,
    capture_output=True)
except OSError:
    raise Exception("Failed to spawn sub-process") from None

Niestety taki interfejs nie daje opcji żeby wysłać signal, więc zamiast użyć subprocess.run(), napisałem swoją implementację run używając Popen:

import os
from subprocess import PIPE, Popen

def run(env: dict, cwd: str, args: list[str]):
    with Popen(args=args, cwd=cwd, env=env, stdout=PIPE, stderr=PIPE) as process:
        os.kill(process.pid, signal.SIGINT)
        try:
            return process.communicate()
        except:
            process.kill()
            raise

Chciałem wysłać sygnał do procesu używając os.kill(). Niestety jak go wysłałem, to process.communicate() zwraca tuple b'', b'' (dwa puste stringi bajtów), i nie dostaję żadnego outputu ze stdout i stderr. Natomiast jak odpale ten sam proces z terminala, to po ubiciu programu dostajemy jakiś output - ten output właśnie chciałbym złapać.

Ma ktoś jakiś pomysł?

PS: Odpowiedź od @CloudPro proszę zignorować, bo jest nie na temat.

1
  1. Czemu os.kill zamiast Popen.send_signal?
  2. Na Windowsie jest różnica między signal.CTRL_C_EVENT, signal.CTRL_BREAK_EVENTsignal.SIGINT.
  3. Być może wysyłasz sygnał zbyt szybko, żeby program zdążył na niego zareagować. Czy jak dodasz małego sleepa, to się coś zmienia?
0
Althorion napisał(a):
  1. Czemu os.kill zamiast Popen.send_signal?
  2. Na Windowsie jest różnica między signal.CTRL_C_EVENT, signal.CTRL_BREAK_EVENTsignal.SIGINT.
  3. Być może wysyłasz sygnał zbyt szybko, żeby program zdążył na niego zareagować. Czy jak dodasz małego sleepa, to się coś zmienia?

sleep() już sam sprawdzłem, nic nie zmienia.

Sprawdzę send_signal().

1 użytkowników online, w tym zalogowanych: 0, gości: 1