Как переопределить sys.stdin для дублирования входного потока - PullRequest
0 голосов
/ 19 декабря 2018

Я пишу программу на Python 3.6 для Windows, чтобы записать все входные данные в подпроцесс для резервного копирования.(Я не могу изменить код подпроцесса, поскольку настоящая программа является коммерческим продуктом (exe-файл), и у меня нет исходного кода.)

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

Main.py :

import subprocess
import sys    

class dup_stream():
    def __init__(self, original_stream, file):
        self.original_stream = original_stream
        self.log = open(file, 'a')

    def write(self, message):
        self.log.write(message)
        self.original_stream.write(message)

    def fileno(self):
        return self.original_stream.fileno()


completed_process = subprocess.run('python Hello.py',
                                   stdin=dup_stream(sys.stdin, 'stdin.txt'),
                                   stderr=dup_stream(sys.stderr, 'stderr.txt'),
                                   stdout=dup_stream(sys.stdout, 'stdout.txt'))

Hello.py :

name = input("Your name:") # e.g. "Jane Doe"
print('Hello,',name)

Ожидаемый результат:

В терминале:

Your name: Jane Doe
Hello, Jane Doe

stdin.txt:

Jane Doe

stdout.txt:

Your name:
Hello, Jane Doe

Ранее я задавал более общий вопрос ( Захват входных данных в subprocess.run () ), но практического ответа не существует.

1 Ответ

0 голосов
/ 19 декабря 2018

subprocess, скорее всего, обойдёт это, потому что он использует fileno напрямую.

Use stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE.Тем не менее, это не совсем просто, как переслать все тогда.Возможно, самый простой способ состоит в том, чтобы иметь 3 потока, по одному для каждого stdin, stdout и stderr, где вы читаете из источника (например, sys.stdin или process.stdout), а затем записываете его в файли к цели (process.stdin или sys.stdout).Смотрите также здесь для некоторых других опций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...