我有一个外部进程,我试图从python触发,然后通过popen .stdin. communication()发送信息。我正在谈论的进程向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()似乎不让你写不止一次的标准输入。接下来我试着用下面的代码替换上一行:
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,但我发现这个对象的文档有点难以理解。我也不是缓冲区和流方面的专家,所以这让我很困惑。
有没有人能透露任何关于通信对象是如何工作的,以及我如何能够做一些类似的事情,但有多个写。还有谁知道在哪里可以读到流和缓冲区?
多谢jon
根据python的文档:
请注意,如果您希望将数据发送到进程的stdin,则需要这样做用stdin=PIPE创建Popen对象。同样,得到任何东西除了结果元组中的None之外,您需要给出stdout=PIPEand/or stderr=PIPE too.