python popen.communicate() 与多个标准输入写入

Posted

技术标签:

【中文标题】python popen.communicate() 与多个标准输入写入【英文标题】:python popen.communicate() with multiple stdin writes 【发布时间】:2012-01-19 13:20:28 【问题描述】:

我有一个外部进程,我试图从 python 触发,然后通过 Popen.stdin.communicate() 发送信息。我正在与之交谈的过程向标准输出写入几行,然后提示用户通过标准输入(一个数字)输入,然后写入几行并提示通过标准输入进行第二次输入。我想用一个 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')

我没有收到任何错误,所以大概数据正在某处,但子进程没有获取数据(我知道这一点,因为当它接收到该数据时它会写入日志文件)。显然我不理解某些东西,我想更好地理解communicate() 在幕后所做的事情,以便我可以找到另一种写入标准输入的方法,但我发现这个对象上的文档有点难以理解。我也不是缓冲区和流方面的专家,所以这让我很困惑。

任何人都可以阐明通信对象的工作原理以及我如何能够做类似但具有多次写入的事情。还有人知道哪里是阅读流和缓冲区的好地方吗?

非常感谢

乔恩

【问题讨论】:

【参考方案1】:

根据python的documentation:

注意,如果你想向进程的标准输入发送数据,你需要 使用 stdin=PIPE 创建 Popen 对象。同样,得到任何东西 除了结果元组中的 None 之外,您需要给出 stdout=PIPE 和/或 stderr=PIPE。

【讨论】:

您好,刚刚更改了帖子以显示具有 PIPE 属性的子进程的创建,我认为我做对了,我假设communicate() 对象将工作并且不应该工作,除非 stdin =管道存在,jt

以上是关于python popen.communicate() 与多个标准输入写入的主要内容,如果未能解决你的问题,请参考以下文章

Python Popen communicate 和wait使用上的区别

Python Popen communicate 和wait使用上的区别

带有标准输入的 subprocess.Popen.communicate() 的管道损坏

了解 Popen.communicate

当 Popen.communicate() 还不够?

为啥 Popen.communicate() 返回 b'hi\n' 而不是 'hi'?