我看到的所有使用Python3的subprocess.Popen与进程交互的示例都只使用Popen.communicate("input_text")一次,然后调用Popen.communicate()获取标准输出并结束程序。我有一些需要通过stdin进行人工干预的程序需要编写脚本,所以我想让它们自动化,因为提示是可预测的。
例如,内部许可应用程序要求我们通过提示(而不是从命令行)传递与客户的唯一ID (4位整数)、用户数等相关的应用程序信息,然后必须执行30次(随机数),每次传递一个由另一个整数标识的不同产品。
如果我能学会如何使用Popen进行持续的来回操作,那么编写脚本就很容易了。我应该使用Popen.communicate(),还是应该使用Popen.stdout和Popen.stdin(),两者之间有什么区别?
发布于 2018-12-19 04:22:38
Popen.communicate将一直阻塞,直到子进程完成或失败,然后才会从stdout和stderr返回信息。所以这不是你需要的。
stdin、stdout和stderr本质上是属于进程的特殊文件,您可以对其进行读写,就像任何其他文件一样,但如果您将信息通过管道传送到这些文件中,它们可以提供进程之间的接口。
我最近不得不实现一些类似于您所描述的东西,我能够通过“客户端”进程的标准输出检索信息的唯一方法是使用pty模块。我将链接两个对我有帮助的答案,但是请注意,这些解决方案仅适用于Posix,使用shell=True存在安全风险。https://stackoverflow.com/a/5413588/533362 & https://stackoverflow.com/a/13605804/3565382.
https://stackoverflow.com/questions/53418210
复制相似问题