Передача по каналу вывода подпроцесса. Popen в файлы

Я должен запустить много продолжительных процессов с subprocess.Popen, и хотел бы иметь stdout и stderr от каждого автоматически переданного по каналу для разделения файлов журнала. Каждый процесс будет работать одновременно в течение нескольких минут, и я хочу два файла журнала (stdout и stderr) для каждого процесса, чтобы быть записанным в как выполненные процессы.

Сделайте я должен постоянно звонить p.communicate() на каждом процессе в цикле, чтобы обновить каждый файл журнала или является там некоторым способом вызвать оригинал Popen команда так, чтобы stdout и stderr автоматически передаются потоком для открытия дескрипторов файлов?

46
задан jww 16 February 2019 в 23:44
поделиться

2 ответа

Поскольку вы находитесь в Windows, службы SQL Server Reporting Services отлично подходят и бесплатны для SQL Server. WYSIWYG можно выполнять в Visual Studio или с помощью автономного инструмента проектирования, который создает PDF вместе с другими типами отчетов, такими как Excel.

После разработки отчета он представляет собой XML-файл, который находится на сервере отчетов и вызывается в приложении C # по SOAP или URL.

Скорее всего, у вас уже есть все, что нужно для его использования.

-121--4043344-

Можно передать stdout и stderr в качестве параметров Popen ()

subprocess.Popen(self, args, bufsize=0, executable=None, stdin=None, stdout=None,
                 stderr=None, preexec_fn=None, close_fds=False, shell=False,
                 cwd=None, env=None, universal_newlines=False, startupinfo=None, 
                 creationflags=0)

Например,

>>> import subprocess
>>> with open("stdout.txt","wb") as out, open("stderr.txt","wb") as err:
...    subprocess.Popen("ls",stdout=out,stderr=err)
... 
<subprocess.Popen object at 0xa3519ec>
>>> 
-121--1140298-

по документам ,

stdin, stdout и stderr стандартный ввод исполняемых программ, стандартный вывод и стандартная ошибка дескрипторы файлов соответственно. Действительный значения PIPE, существующий файл дескриптор (положительное целое число), существующий объект файла и значение «Нет».

Поэтому просто передайте открытые для записи файловые объекты как именованные аргументы stdout = и stderr = , и вы должны быть в порядке!

36
ответ дан 26 November 2019 в 20:14
поделиться

Вы можете передать stdout и stderr в качестве параметров в Popen ()

subprocess.Popen(self, args, bufsize=0, executable=None, stdin=None, stdout=None,
                 stderr=None, preexec_fn=None, close_fds=False, shell=False,
                 cwd=None, env=None, universal_newlines=False, startupinfo=None, 
                 creationflags=0)

, например

>>> import subprocess
>>> with open("stdout.txt","wb") as out, open("stderr.txt","wb") as err:
...    subprocess.Popen("ls",stdout=out,stderr=err)
... 
<subprocess.Popen object at 0xa3519ec>
>>> 
74
ответ дан 26 November 2019 в 20:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: