我有一个外部进程,我试图从python触发,然后通过Popen.stdin.communicate()发送信息。我正在谈论的过程向stdout写了几行,然后通过stdin(一个数字)提示用户输入,然后写入一些矿石线并通过stdin提示输入第二个。我想用python脚本替换手动输入,这将为我自动化。到目前为止,我有以下代码,可以很好地提交第一轮用户输入:
working_file = subprocess.Popen(["/pyRoot/iAmACrashyProgram"], stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE)
working_file.communicate(input=b'3')[0]
子进程按预期运行,然后提示输入第二个输入,不幸的是,communication()似乎不允许你多次写入stdin。接下来我尝试用以下内容替换上一行:
working_file = subprocess.Popen(["/pyRoot/iAmACrashyProgram"], stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE)
working_file.stdin.write(b'3')
working_file.stdin.write(b'7')
我没有得到任何错误,所以可能数据正在某处,但是子进程没有获取数据(我知道这是因为当它接收到数据时它会写入日志文件)。显然我不理解某些东西,我想更好地理解沟通()在幕后做什么,这样我就可以找到另一种写入stdin的方法,但我发现这个对象的文档有点难以理解。我也不是缓冲区和流的专家,所以这让我感到沮丧。
任何人都可以了解通信对象的工作原理以及我如何能够做出类似但有多次写入的情况。还有谁知道哪里是阅读流和缓冲区的好地方?
非常感谢
乔恩
答案 0 :(得分:0)
根据python的documentation:
请注意,如果要将数据发送到进程的stdin,则需要 使用stdin = PIPE创建Popen对象。同样,得到任何东西 除了结果元组中的None之外,你需要给stdout = PIPE 和/或stderr = PIPE。