Запустить отдельный бесконечный процесс с Python в Windows и передать вывод в файл

Я пытаюсь запустить процесс с Python, который работает бесконечно, и выводит его в файл. Новый созданный процесс должен продолжать работать после выхода исполняемого файла python. Я могу запустить процесс и продолжить его выполнение, когда python завершит работу с помощью этого кода:

subprocess.Popen(command_list, creationflags=subprocess.DETACHED_PROCESS | subprocess.CREATE_NEW_PROCESS_GROUP | subprocess.CREATE_BREAKAWAY_FROM_JOB)

Теперь я пытаюсь передать вывод запущенного процесса в файл, но не могу заставить его работать вместе с отсоединением процесса.

Любые предложения о том, как этого добиться?

обратите внимание, что я пытаюсь добиться этого в Windows.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
0
737
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы пробовали просто перенаправить 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, так как вывод вашего процесса может быть перенаправлен на любой из них.

CREATE_NEW_PROCESS_GROUP практически бессмысленен в сочетании с DETACHED_PROCESS (т.е. не наследует и не выделяет консоль). Группа, к которой он относится, является группой процессов консоли, поскольку консоль - единственный компонент системы, который ее использует, и только как фильтр для GenerateConsoleCtrlEvent.
Eryk Sun 08.01.2019 23:35

Я настоятельно рекомендую переопределить все стандартные дескрипторы как допустимые дескрипторы файлов при использовании DETACHED_PROCESS, поскольку некоторые консольные приложения не работают, если стандартный дескриптор недействителен. Установите stdin=subprocess.DEVNULL.

Eryk Sun 08.01.2019 23:39

между прочим, для любого, кто обратится к этому в будущем, есть смесь имен файлов stderr и stdout и места их передачи по конвейеру. @RoadRunner

David Lichterov 09.01.2019 08:32

@DavidLichterov Я тестирую в Windows, и большую часть времени фактический вывод передается на stderr.txt. Должно быть проблема с Windows, потому что в Linux он передается по конвейеру в stdout.txt.

RoadRunner 09.01.2019 08:42

@RoadRunner Я думаю, это зависело от того, какой процесс вы выполняете. Я запускаю qemu, и он правильно выводит на стандартный вывод. В любом случае это могло сбить людей с толку.

David Lichterov 09.01.2019 09:00

@DavidLichterov Да, это правда. Я добавил комментарий в ответ, чтобы убедиться, что оба файла проверены.

RoadRunner 09.01.2019 10:39

Другие вопросы по теме