Python 子进程正在等待结束以继续
这段代码:Python 子进程正在等待结束以继续,python,windows,python-2.7,Python,Windows,Python 2.7,这段代码: reply = subprocess.Popen(Command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) data, error = reply.communicate() outputText.insert("end", data + "\n") 此时,它运行整个子进程(在一堆行上循环),然后才运行outputText位 我可以更改什么来为脚本的每个循环运行outputText,而不是在子流程完成时。我在末尾尝
reply = subprocess.Popen(Command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
data, error = reply.communicate()
outputText.insert("end", data + "\n")
此时,它运行整个子进程(在一堆行上循环),然后才运行outputText位
我可以更改什么来为脚本的每个循环运行outputText,而不是在子流程完成时。我在末尾尝试了一个.wait(),但它出现了一个“'int'对象没有属性'communicate'”消息错误
谢谢,
克里斯
编辑:这是命令输出的一次迭代示例:
Ignoring profile '\\MachineName\C$\Users\UserName1' (reason: directory inclusion)
Ignoring profile '\\MachineName\C$\Users\UserName2' (reason: directory inclusion)
The following user profiles match the deletion criteria:
\\MachineName\C$\Users\UserName3
输出中可能包含许多行。您需要直接迭代
回复
的标准输出
属性,而不是调用通信
,后者将一直阻塞到命令
完成:
reply = subprocess.Popen(Command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
for line in reply.stdout:
outputText.insert("end", line +"\n")
这会将子流程中的每一行标准输出插入到输出文本中,一次插入一行,直到命令完成
编辑:
下面是如何使用您正在谈论的“循环”来完成您正在尝试的操作。您需要自己添加is\u end\u of\u loop
的逻辑
out = ""
for line in reply.stdout:
out += line
if is_end_of_loop(line):
outputText.insert("end", out +"\n")
out = ""
您是说您尝试了reply=subprocess.Popen(…).wait()
?相反,请按现在的方式尝试reply=subprocess.Popen(…)
,然后在自己的行上尝试reply.wait()
。(我不知道在这种情况下,wait
是否有用,但这至少可以修复属性错误)谢谢@Kevin。它消除了错误,但你是对的——根本没有帮助。lol.所以你想在命令
仍在执行时打印命令
的每一行输出,而不是只在完成后打印?谢谢@dano。我已经编辑了我的原始Q,以包含命令输出的示例。此文件中可能包含多行。如果我将代码更改为上面的示例,它将为命令输出中的每一行运行一行to outputText。我需要它只为每个命令循环运行。我希望这是有意义的…其他人有什么建议吗…?@user3514446听起来您仍然希望像上面的代码那样逐行迭代reply.stdout
,但不是调用outText.insert
对于每一行,您需要将每一行附加到一个变量,直到您知道您已经完成了一个循环。您可以通过解析每一行并查找将其标识为循环最后一行的内容来识别它。查看我的编辑代码示例。嗯,我猜这是行不通的(至少,不是我想要的方式)。。。根据我在原始问题中添加的示例,可能有1或100行类似的行,只是末尾有一个不同的用户id。该命令本身没有“end”。。