我正在 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 个线程,每个线程对应 stdin
、stdout
和 stderr
,您可以在其中从源代码中读取内容(例如 sys.stdin
或 process.stdout
),然后将其写入文件和目标(process.stdin
或 sys .stdout
)。
另请参阅here其他一些选项。
关于python - 如何覆盖 sys.stdin 以复制输入流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53846960/