python管道只有stdin,出一次,怎么做两次或更多次

时间:2017-01-13 05:43:07

标签: python pipeline

成功python管道stdin,只出一次这个源

main.py

import subprocess from subprocess import PIPE, STDOUT

player_pipe = subprocess.Popen(["source\call.py", 'arg1'], stdin=PIPE,
     stdout=PIPE, stderr=STDOUT, shell=True)

player_pipe.stdin.write("Send Msg\n")
get_stdout = player_pipe.stdout.readline()
print("[Get Msg]" + get_stdout)

player_pipe.kill()
player_pipe.wait()

call.py

import sys

getMsg = raw_input()
print getMsg

但我想要两次或更多时间stdin,out

所以更新来源,但它不起作用

这个来源有什么不对

main.py(更新 - 不工作)

import subprocess from subprocess import PIPE, STDOUT

player_pipe = subprocess.Popen(["source\call.py", 'arg1'], stdin=PIPE,
     stdout=PIPE, stderr=STDOUT, shell=True)

player_pipe.stdin.write("Send Msg\n")
get_stdout = player_pipe.stdout.readline()
print("[Get Msg]" + get_stdout)

player_pipe.stdin.write("Send Msg2\n")
get_stdout = player_pipe.stdout.readline()
print("[Get Msg]" + get_stdout)

player_pipe.kill()
player_pipe.wait()

call.py(更新 - 不工作)

import sys

getMsg = raw_input()
print getMsg

getMsg2 = raw_input()
print getMsg2

:d

2 个答案:

答案 0 :(得分:1)

call.py的输出被缓冲。所以你必须flush()发送给main.py

#!/usr/bin/python2
import sys

getMsg = raw_input()
print getMsg
sys.stdout.flush()

getMsg2 = raw_input()
print getMsg2
sys.stdout.flush()

请注意,至少当你的操作系统是Linux时你需要shebang #!/usr/bin/python2(我不知道为什么OP的代码在没有shebang的情况下工作。也许是一些Windows魔术?)。

此外,您可以使用-u选项不缓冲python的输出。

player_pipe = subprocess.Popen(["/usr/bin/python2","-u","./call.py"], stdin=PIPE,
     stdout=PIPE, stderr=STDOUT, shell=False)

答案 1 :(得分:0)

当你说“但我想要两次或更多时间stdin,out”时,我不确定你的意思是什么。

在基本的Linux / UNIX系统中,您只有1个 - 只有一个 - STDIN,STDOUT和STDERR。现在,你可以输入和输出东西,如果你愿意,可以单独处理STDERR,但你不能随意分配多个输入而不需要设置单独的机制(套接字等)来处理你的程序。