2011-12-13 253 views
3

我有一个外部进程,我试图从python触发,然后通过Popen.stdin.communicate()发送信息。我正在谈论的过程中写了几行stdout,然后提示用户输入stdin(一个数字),然后写入一些矿石行并提示通过stdin进行第二次输入。我想用一个可以自动执行此操作的python脚本替换手动输入。到目前为止,我有以下代码确实提交了第一轮用户输入的工作:)python popen.communicate()与多个标准输入写入

working_file = subprocess.Popen(["/pyRoot/iAmACrashyProgram"], stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE) 
working_file.communicate(input=b'3')[0] 

子进程的行为与预期,然后提示输入第二个输入,遗憾的是沟通(似乎没有让你不止一次写入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') 

我没有得到任何错误,那么想必数据去什么地方,但子没有得到的数据(我知道这是因为,当它接收到数据写入日志文件)。很明显,即使我不理解某些东西,我也希望更好地了解通信()在后台进行的操作,以便我可以找到另一种写入标准输入的方法,但是我发现此对象上的文档有点难以理解。我也不是缓冲区和流的专家,所以这让我感到沮丧。

任何人都可以阐明通信对象是如何工作的,以及我可以如何做一些类似的事情,但有多个写入。还有谁知道哪里是读取流和缓冲区的好地方?

非常感谢

乔恩

回答

0

按照Python的documentation

注意,如果你想将数据发送到进程的标准输入,你需要 与标准输入创建POPEN对象=管。同样,要在结果元组中获得除None之外的任何其他值 ,则需要输出stdout = PIPE 和/或stderr = PIPE。

+0

嗨,那里,只是改变了职位,以显示与PIPE属性的子过程的创建,我想我做到了这一点,我假设沟通()对象将起作用,并且不应该工作,除非stdin = PIPE现在,jt – 2011-12-13 17:19:01