3

我在 Windows 上有一个交互式 shell 应用程序。我想编写一个 python 脚本,它将命令发送到该 shell 应用程序并读回响应。但是我想以交互方式进行,即只要 python 脚本存在,我希望 shell 应用程序继续运行。

我努力了

self.m_process subprocess.Popen(path_to_shell_app,shell=True,stdin=subprocess.PIPE,stdout=subprocess.PIPE,universal_newlines=True)

然后使用标准输入和标准输出发送和接收数据。似乎正在打开 shell 应用程序,但我无法与之通信。

我究竟做错了什么?

4

2 回答 2

1

接下来你应该使用通信

stdout, stderr = self.m_process.communicate(input=your_input_here)

子流程模块文档

Popen.communicate(input=None)
与进程交互:向标准输入发送数据。从 stdout 和 stderr 读取数据,直到到达文件结尾。等待进程终止。可选的输入参数应该是要发送到子进程的字符串,或者如果不应该向子进程发送数据,则为 None。

通信()返回一个元组(stdoutdata,stderrdata)。

请注意,如果您想将数据发送到进程的标准输入,您需要使用标准输入=PIPE 创建 Popen 对象。同样,要在结果元组中获得除 None 以外的任何内容,您也需要提供 stdout=PIPE 和/或 stderr=PIPE 。

于 2016-02-17T13:29:34.647 回答
1

有一个专门为此而构建的模块:pexpect。使用 、import pexpect,然后使用process = pexpect.spawn(myprogram)来创建新的子流程,并使用process.expect(mystring)process.expect_exact(mystring)来搜索提示,或获取响应。 process.send(myinput)process.sendline(myinput)用于向子流程发送信息。

于 2016-02-17T13:31:06.820 回答