Я пытаюсь запустить процесс с Python, который работает бесконечно, и выводит его в файл. Новый созданный процесс должен продолжать работать после выхода исполняемого файла python. Я могу запустить процесс и продолжить его выполнение, когда python завершит работу с помощью этого кода:
subprocess.Popen(command_list, creationflags=subprocess.DETACHED_PROCESS | subprocess.CREATE_NEW_PROCESS_GROUP | subprocess.CREATE_BREAKAWAY_FROM_JOB)
Теперь я пытаюсь передать вывод запущенного процесса в файл, но не могу заставить его работать вместе с отсоединением процесса.
Любые предложения о том, как этого добиться?
обратите внимание, что я пытаюсь добиться этого в Windows.






Вы пробовали просто перенаправить stderr и стандартный вывод в два файла:
from subprocess import Popen
from subprocess import DEVNULL
from subprocess import DETACHED_PROCESS
from subprocess import CREATE_NEW_PROCESS_GROUP
from subprocess import CREATE_BREAKAWAY_FROM_JOB
command_list = ...
creationflags = DETACHED_PROCESS | CREATE_NEW_PROCESS_GROUP | CREATE_BREAKAWAY_FROM_JOB
with open("stderr.txt", mode = "wb") as out, open("stdout.txt", mode = "wb") as err:
Popen(command_list, creationflags=creationflags, stdin=DEVNULL, stdout=out, stderr=err)
Обязательно проверьте stderr.txt и stdout.txt, так как вывод вашего процесса может быть перенаправлен на любой из них.
Я настоятельно рекомендую переопределить все стандартные дескрипторы как допустимые дескрипторы файлов при использовании DETACHED_PROCESS, поскольку некоторые консольные приложения не работают, если стандартный дескриптор недействителен. Установите stdin=subprocess.DEVNULL.
между прочим, для любого, кто обратится к этому в будущем, есть смесь имен файлов stderr и stdout и места их передачи по конвейеру. @RoadRunner
@DavidLichterov Я тестирую в Windows, и большую часть времени фактический вывод передается на stderr.txt. Должно быть проблема с Windows, потому что в Linux он передается по конвейеру в stdout.txt.
@RoadRunner Я думаю, это зависело от того, какой процесс вы выполняете. Я запускаю qemu, и он правильно выводит на стандартный вывод. В любом случае это могло сбить людей с толку.
@DavidLichterov Да, это правда. Я добавил комментарий в ответ, чтобы убедиться, что оба файла проверены.
CREATE_NEW_PROCESS_GROUPпрактически бессмысленен в сочетании сDETACHED_PROCESS(т.е. не наследует и не выделяет консоль). Группа, к которой он относится, является группой процессов консоли, поскольку консоль - единственный компонент системы, который ее использует, и только как фильтр дляGenerateConsoleCtrlEvent.