2017-01-13 1 views
0

успеха питон трубы, из стандартного ввода только один раз этот источникпитон трубы только 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, из

так обновить источник, но он не работает

Что случилось это источник

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

ответ

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() 

Обратите внимание, что вам нужно хижину #!/usr/bin/python2 по крайней мере, когда ваша ОС Linux (я не знаю, почему код OP работает без хижину. Может быть, некоторые магии с Windows?).

Также вы можете использовать опцию -u, чтобы не буферировать вывод python.

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

спасибо, хорошо работает, я не знаю, почему это в окне, возможно, с помощью git bash? –

0

Когда вы говорите «но я хочу дважды или больше времени stdin, out», я не уверен, что вы на самом деле имеете в виду.

В базовой системе Linux/UNIX у вас есть 1 - и только один - STDIN, STDOUT и STDERR. Теперь вы можете перетаскивать вещи внутрь и снаружи, рассматривая STDERR отдельно, если хотите, но вы не можете просто произвольно назначать несколько входов без установки отдельных механизмов (сокетов и т. Д.) Для обработки этого в вашей программе.

+0

Извините, я плохо разбираюсь в системе Linux/Unix. Я не понимаю. –

Смежные вопросы