Рассматривая ваши проблемы по одному:
Я вынужден использовать shell = True, чтобы заставить работать перенаправления
Вы не можетепросто используйте параметры stdout
и stderr
?
out_log = open("stdout_log", "w")
err_log = open("stderr_log", "w")
subproc = subprocess.popen(..., stdout=out_log, stderr=err_log, ...)
Обработка дочернего stdout / stderr в родительском процессе python - не вариант, так как я не смог найти функциональные возможности для этогобез ожидания (и родительский процесс python должен выполнять другие действия во время работы дочернего элемента)
Это из-за Windows.В ОС Unix-типа вы просто используете модуль select .Windows может только select
для сокетов, но не для файлов.
Если я использую shell = True, то subprocess.kill () будет завершать только оболочку, но не дочерний процесс
Потому что, когда shell=True
оболочка является дочерним процессом, а команды - его дочерними.
Мне нужен надежный метод завершения дочернего процесса, который работает на любомплатформа (но по крайней мере Linux и Windows)
Существует ли надежный метод завершения дочернего процесса для Windows?Последнее, что я слышал, даже конечная задача диспетчера задач не была надежной на 100%.А в Linux вы, возможно, не сможете убить процесс, у которого файл открыт через сбойный драйвер.
Как сказал Стигма, для поддержки Windows вам потребуется использовать потоки в качестве прокси подпроцесса.Кроме того, вы должны попытаться запустить с shell=False
, и если вы не можете, объясните, почему нет.