python - 如何覆盖 sys.stdin 以复制输入流

标签 python python-3.x subprocess

我正在 Windows 上编写一个 Python 3.6 程序,用于记录子进程的所有输入以进行备份。 (我无法修改子进程代码,因为真正的程序是商业产品(exe文件)并且我没有源代码。)

我尝试了下面的代码,但它不起作用。文本仅显示在终端中,用于日志记录的 txt 文件为空。

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

标准输出.txt:

Your name:
Hello, Jane Doe

我之前问过一个更一般的问题(Capture inputs to subprocess.run()),但没有任何实际的答案。

最佳答案

subprocess 很可能会绕过这个,因为它直接使用 fileno

使用stdin=subprocess.PIPE、stdout=subprocess.PIPE、stderr=subprocess.PIPE。 然而,如何转发所有内容并不完全简单。也许最简单的方法是有 3 个线程,每个线程对应 stdinstdoutstderr,您可以在其中从源代码中读取内容(例如 sys.stdinprocess.stdout),然后将其写入文件和目标(process.stdinsys .stdout)。 另请参阅here其他一些选项。

关于python - 如何覆盖 sys.stdin 以复制输入流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53846960/

相关文章:

python - subprocess.call 在 PyCharm (linux) 中不工作

python - 如何在 python 中打开终端并运行命令?

c++ - 作为 QT 小部件的子进程

python - uWSGI 重置 PythonHome

python - 未等待的任务总是在通过 create_task 创建时开始吗?

python-3.x - 为 Excel 工作表 : xlsxwriter 创建超链接

python - 如何持久化 patsy DesignInfo?

python - Python 的轻量级标记语言

python - 使用 unicode 以任何语言保存文件

python - Gekko 和中间变量