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.