Python:无法使用子进程modu在另一个命令行应用程序中读/写

2024-09-30 01:31:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我在Windows中使用python3.0,并尝试自动化命令行应用程序的测试。用户可以在测试中的应用程序中键入命令,并以2个XML包的形式返回输出。一个是包,另一个是包。通过分析这些数据包,我可以验证结果。我认为代码如下

p = subprocess.Popen(SomeCmdAppl, stdout=subprocess.PIPE,

                   shell = True, stdin=subprocess.PIPE, stderr=subprocess.STDOUT)

p.stdin.write((command + '\r\n').encode())
time.sleep(2.5)
testresult = p.stdout.readline()
testresult = testresult.decode()
print(testresult)

我不能收回任何输出。它在我试图使用readline()读取输出的地方卡住了。我试过read(),但它也卡住了

当我手动运行命令行应用程序并键入命令时,我会将输出正确地作为两个xml包返回,如下所示

^{pr2}$

但是当我使用下面的communicate()时,我得到的是发送的数据包,而从来没有得到Recv:packet。为什么我错过了录像包?通信(0应该从stdout获取所有信息。rt?在

p = subprocess.Popen(SomeCmdAppl, stdout=subprocess.PIPE,

                   shell = True, stdin=subprocess.PIPE, stderr=subprocess.STDOUT)
p.stdin.write((command + '\r\n').encode())
time.sleep(2.5)
result = p.communicate()[0]
print(result)

有人能帮我做一个应该有用的示例代码吗?我不知道是否需要在不同的线程中读写。请帮帮我。我需要反复读/写。我能用python中的高级模块吗。我认为Pexpect模块在Windows下不工作


Tags: 代码命令行命令应用程序键入windowsstdinstdout
3条回答

尝试使用communicate而不是write发送输入:

result = p.communicate((command + '\r\n').encode())[0]

您是否考虑过使用pexpect而不是子流程?它处理可能会阻止代码工作的细节(如刷新缓冲区等)。它可能还不适用于Py3k,但它在2.x中运行良好

参见:http://pexpect.sourceforge.net/pexpect.html

这是一个常见问题,例如,请参见:

(实际上,您应该在创建问题时看到这些…?!)。在

我有两件事感兴趣:

  • p。标准写入((command+'\r\n').encode())也被缓冲,因此您的子进程甚至可能没有看到它的输入。你可以试试冲洗这个管子。在
  • 在另一个问题中,有人建议对子对象进行stdout.readline(),而不是readline(),要读的字符数量适当。你可以试试这个。在

公布你的结果。在

相关问题 更多 >

    热门问题