顺序从subprocess.Popen通过socket发送stdout

时间:2011-09-22 14:41:19

标签: python sockets subprocess popen

我知道以前已经多次接受了这个问题,但是在我的方案中我没有找到一种方法来做到这一点...我希望你能提供帮助。 我想将来自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

1 个答案:

答案 0 :(得分:3)

p.poll()表示进程是否正在执行。因此,一旦程序退出,它就会返回false。所以这不是你应该检查的内容。

您的代码:

for i in p.stdout.readline():

读取一行,然后遍历该行中的每个字母。不是你想要的。使用:

for i in p.stdout.readlines():

将返回每一行。

但是这会在生成任何行之前读取整个文件,可能不是你想要的。

所以使用:

for line in p.stdout:

哪一行应该逐行给你每行,直到没有其他内容可以阅读