1
要與一個啓動一次並在單獨進程中運行的shell進行通信,我使用了Popen
from subprocess
。使用FIFOs在python中輸入和輸出
import os
from subprocess import Popen, PIPE
def server():
FIFO_PATH = '/tmp/my_fifo'
FIFO_PATH2 = '/tmp/in_fifo'
if os.path.exists(FIFO_PATH):
os.unlink(FIFO_PATH)
if os.path.exists(FIFO_PATH2):
os.unlink(FIFO_PATH2)
if not os.path.exists(FIFO_PATH2):
os.mkfifo(FIFO_PATH2)
in_fifo = open(FIFO_PATH2, 'rw+')
print "in_fifo:", in_fifo
if not os.path.exists(FIFO_PATH):
os.mkfifo(FIFO_PATH)
my_fifo = open(FIFO_PATH, 'rw+')
print "my_fifo:", my_fifo
p = Popen(['python', '-u', 'shell.py'], shell=False, stdin=in_fifo, stdout=my_fifo)
def read():
FIFO_PATH = '/tmp/my_fifo'
i=0
while i < 10:
++i
print i, open(FIFO_PATH, 'r').readline()
def write(input):
FIFO_PATH2 = '/tmp/in_fifo'
pipe = open(FIFO_PATH2, 'w+')
pipe.write(input+'\n')
def test():
server()
write('test')
read()
和shell.py
Input = ' '
print 'shell called'
while Input!= 'z':
Input=raw_input()
print 'input ', Input
if Input != '':
if Input == 'test':
print 'Yeehhaaaaa it works'
所以調用test()
給出的結果
in_fifo: <open file '/tmp/in_fifo', mode 'rw+' at 0x7f0a4e17ed20>
my_fifo: <open file '/tmp/my_fifo', mode 'rw+' at 0x7f0a4e17edb0>
0 shell called
0 input test
問題
爲什麼只有第一行印?如何打印所有行?
此外我不確定正確使用FIFO。也許有更好的方法來完成這件事。我接受任何建議。
使用p
調用p.stdin.write()
和p.stdout.readline()
對我來說是無解的,因爲我必須從JavaScript調用的功能,而無需實例p
。
非常感謝你的工作。 但是,如何確定FIFO是否爲空?因爲如果我做readline(),就沒有什麼可讀的,它會永遠等待。也許我可以以某種方式使用超時? – Maori
好的我用os.open(),os.read()完成事情,並用errno == EAGAIN捕獲異常 – Maori