Ахой! У меня есть оболочка python, которая собирает некоторые параметры командной строки, встраивает их подмножество в файл и вызывает подпроцесс, передавая имя файла в качестве входных данных и остальные параметры командной строки в качестве параметров. Затем он обрабатывает вывод и распечатывает его в другом формате. Подпроцесс вызывается так:
# generate cfg file
cfg_file = open(cfg_file_name, "w")
...
# call executable
command = "./%s -time %s -model %s" % (executable, args.time, args.model)
if args.branching != None:
command += " -branching %s" % args.branching
command += " %s" % (cfg_file_name)
output = run_and_report(command)
# process output
...
Где run_and_report
определяется как:
def run_and_report(cmd):
"""Run command on the shell, report stdout, stderr"""
proc = run(cmd)
proc.wait()
output = "".join(map(lambda x: x.rstrip(), proc.stdout))
return output
и run
как
def run(cmd):
"""Open process"""
return Popen(cmd, shell=True, stdout=PIPE, stderr=PIPE, close_fds=True)
Сама оболочка вызывается аналогичным образом процедурой более высокого уровня, которая время от времени должна убивать некоторые из порожденных ею процессов-оболочек. Моя проблема в том, что иногда кажется, что уничтожение оболочки оставляет executable
работающим, поэтому оболочка эффективно уничтожается, но основной процесс - нет. Однако, насколько мне известно, в python невозможно поймать SIGKILL, как с другими прерываниями, поэтому кто-нибудь знает способ гарантировать, что основной процесс будет уничтожен?
Спасибо,
Туннуз