我在Windows上有一个交互式shell应用程序。 我想编写一个python脚本,它将命令发送到该shell应用程序并读回响应。 但是我想以交互方式进行,即我希望shell应用程序在python脚本运行时保持运行。
我试过了
self.m_process subprocess.Popen(path_to_shell_app,shell=True,stdin=subprocess.PIPE,stdout=subprocess.PIPE,universal_newlines=True)
然后使用stdin和stdout发送和接收数据。 似乎shell应用程序正在打开,但我无法与之通信。
我做错了什么?
答案 0 :(得分:1)
接下来,您应该使用communicate
stdout, stderr = self.m_process.communicate(input=your_input_here)
来自subprocess模块文档
<强> Popen.communicate(输入=无) 强>
与流程交互:将数据发送到stdin。从stdout和stderr读取数据,直到达到文件结尾。 等待进程终止。可选的输入参数应为a 要发送到子进程的字符串,如果没有数据,则为None 寄给孩子。communic()返回一个元组(stdoutdata,stderrdata)。
请注意,如果要将数据发送到进程的stdin,则需要 使用stdin = PIPE创建Popen对象。同样,得到任何东西 除了结果元组中的None之外,你需要给stdout = PIPE 和/或stderr = PIPE。
答案 1 :(得分:1)
有一个专门为此构建的模块:pexpect。要使用import pexpect
,然后使用process = pexpect.spawn(myprogram)
创建新的子流程,并使用process.expect(mystring)
或process.expect_exact(mystring)
来搜索提示或获取回复。 process.send(myinput)
和process.sendline(myinput)
用于向子流程发送信息。