我想要的是运行一个程序并记录标准输入和标准输出,但我希望从文件提供标准输入。
我认为script log.txt < input.txt
会起作用,但事实并非如此,因为标准输入不会被记录,只有输出会被记录。
其中 input.txt 是
./program
something for the stdin of program
some more stuff
答案1
这可能不是最漂亮的解决方案,但您可以执行以下操作:
cat file.txt | tee -a stdin.txt | ./program | tee -a stdout.txt
您可以在两个 tee 中使用相同的文件,但您的输入和输出可能会被破坏且无法读取。
答案2
您已经有了标准输入日志:那就是您的文件。
否则(不确定这是否是您想要实现的目标),如果您想要一个包含 stdin 和 stdout 的日志,您可以修改程序以在读取行之前将它们从 stdin 发送到 stdout它们被处理。
答案3
我最终把这个东西整合在一起:
import subprocess
import time
import sys
log = open(sys.argv[3], 'w')
input = open(sys.argv[2], 'r')
p = subprocess.Popen([sys.argv[1]], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
def readAllSoFar(proc, retVal=''):
while (subprocess.select.select([proc.stdout],[],[],0)[0]!=[]):
retVal+=proc.stdout.read(1)
return retVal
while True:
print('starting loop')
line = input.readline()
print('read line ' + line)
if not line:
print('breaking')
break
print('before sleep1')
time.sleep(0.1)
print('before readAllSoFar')
output = readAllSoFar(p)
print('got output' + output)
log.write(output)
time.sleep(0.1)
log.write(line)
p.stdin.write(line)
运行它python runner.py ./program_to_run input.txt output.txt
它假设命令的任何输出都将在十分之一秒内完成。