Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:无法使用子流程模块在另一个命令行应用程序中读/写_Python_Subprocess_Readline - Fatal编程技术网

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

Python:无法使用子流程模块在另一个命令行应用程序中读/写,python,subprocess,readline,Python,Subprocess,Readline,我正在Windows中使用Python3.0,并尝试自动测试命令行应用程序。用户可以在被测应用程序中键入命令,并将输出作为2个XML数据包返回。一个是包,另一个是包。通过分析这些数据包,我可以验证结果。我的代码如下所示 p = subprocess.Popen(SomeCmdAppl, stdout=subprocess.PIPE, shell = True, stdin=subprocess.PIPE, stderr=subprocess.STDOUT)

我正在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数据包的正确输出

Sent: <PivotNetMessage>
<MessageId>16f8addf-d366-4031-b3d3-5593efb9f7dd</MessageId>
<ConversationId>373323be-31dd-4858-a7f9-37d97e36eb36</ConversationId>
<SageId>4e1e7c04-4cea-49b2-8af1-64d0f348e621</SagaId>
<SourcePath>C:\Python30\PyNTEST</SourcePath>
<Command>echo</Command>
<Content>Hello</Content>
<Time>7/4/2009 11:16:41 PM</Time>
<ErrorCode>0</ErrorCode>
<ErrorInfo></ErrorInfo>
</PivotNetMessagSent>

Recv: <PivotNetMessage>
<MessageId>16f8addf-d366-4031-b3d3-5593efb9f7dd</MessageId>
<ConversationId>373323be-31dd-4858-a7f9-37d97e36eb36</ConversationId>
<SageId>4e1e7c04-4cea-49b2-8af1-64d0f348e621</SagaId>
<SourcePath>C:\PivotNet\Endpoints\Pipeline\Pipeline_2.0.0.202</SourcePath>
<Command>echo</Command>
<Content>Hello</Content>
<Time>7/4/2009 11:16:41 PM</Time>
<ErrorCode>0</ErrorCode>
<ErrorInfo></ErrorInfo>
</PivotNetMessage>

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

请尝试使用
通信
发送输入,而不是使用
写入

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

尝试使用
通信
发送输入,而不是使用
写入

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

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

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

我有两件感兴趣的事:

  • p、 stdin.write((command+'\r\n').encode())也被缓冲,因此您的子进程甚至可能没有看到它的输入。你可以试着冲洗一下这根管子
  • 在另一个问题中,有人建议对子对象执行stdout.read()而不是readline(),并使用适当数量的字符进行读取。你可能想试试这个

发布您的结果。

这是一个普遍存在的问题,例如,请参阅:

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

我有两件感兴趣的事:

  • p、 stdin.write((command+'\r\n').encode())也被缓冲,因此您的子进程甚至可能没有看到它的输入。你可以试着冲洗一下这根管子
  • 在另一个问题中,有人建议对子对象执行stdout.read()而不是readline(),并使用适当数量的字符进行读取。你可能想试试这个

发布结果。

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


请参阅:

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


请参阅:

我有很多输入命令需要发送和读取输出。沟通有可能吗?哦,现在我明白了。不,不是。你应该在你的问题中详细说明这一点,这一点很重要。我会删除这个答案。请不要删除你的答案。。。这很有帮助。。但即使是comminucate()也缺少数据包。它只收到一包。我缺少什么我有很多输入命令需要发送和读取输出。沟通有可能吗?哦,现在我明白了。不,不是。你应该在你的问题中详细说明这一点,这一点很重要。我会删除这个答案。请不要删除你的答案。。。这很有帮助。。但即使是comminucate()也缺少数据包。它只收到一包。我错过了什么