我知道以前已经多次接受了这个问题,但是在我的方案中我没有找到一种方法来做到这一点...我希望你能提供帮助。
我想将来自stdout和/或stderr的数据从Popen调用实时输出到套接字连接,而不是stdout。所以sys.stdout.flush()不适合我。
data=sok.recv(512) #the command to execute
p = subprocess.Popen(data, shell=True, stdout=subprocess.PIPE stderr=subprocess.PIPE)
#this work.. but not how i spected, if the subprocess ends too fast, i only get the first line
while p.poll() is None:
sok.send(p.stdout.readline())
#this only send the last line
for i in p.stdout.readline():
sok.send(i)
sys.stdout.flush() #why sys.stdout? i don't use it
p.stdout.flush() #same result
data=sok.recv(512) #the command to execute
p = subprocess.Popen(data, shell=True, stdout=subprocess.PIPE stderr=subprocess.PIPE)
#this work.. but not how i spected, if the subprocess ends too fast, i only get the first line
while p.poll() is None:
sok.send(p.stdout.readline())
#this only send the last line
for i in p.stdout.readline():
sok.send(i)
sys.stdout.flush() #why sys.stdout? i don't use it
p.stdout.flush() #same result
答案 0 :(得分:3)
p.poll()表示进程是否正在执行。因此,一旦程序退出,它就会返回false。所以这不是你应该检查的内容。
您的代码:
for i in p.stdout.readline():
读取一行,然后遍历该行中的每个字母。不是你想要的。使用:
for i in p.stdout.readlines():
将返回每一行。
但是这会在生成任何行之前读取整个文件,可能不是你想要的。
所以使用:
for line in p.stdout:
哪一行应该逐行给你每行,直到没有其他内容可以阅读