Um mit einer Shell zu kommunizieren, die einmal gestartet wird und in einem separaten Prozess ausgeführt wird, habe ich Popen
from subprocess
verwendet.mit FIFOs für Eingabe und Ausgabe in 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()
und die shell.py
Input = ' '
print 'shell called'
while Input!= 'z':
Input=raw_input()
print 'input ', Input
if Input != '':
if Input == 'test':
print 'Yeehhaaaaa it works'
so nennen test()
geben folgendes Ergebnis
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
Fragen
Warum ist nur die erste Zeile gedruckt? Wie drucke ich alle Zeilen?
Auch bin ich mir nicht sicher über die richtige Verwendung von FIFOs. Vielleicht gibt es bessere Möglichkeiten, dies zu tun. Ich bin offen für irgendwelche Vorschläge.
p
Mit p.stdin.write()
und p.stdout.readline()
zu nennen, ist keine Lösung für mich, weil ich die Funktionen von JavaScript aufrufen, ohne p
die Instanz zu haben.
Vielen Dank es funktioniert. Aber wie kann ich feststellen, ob Fifo leer ist? denn wenn ich readline() lese und nichts zu lesen ist, wartet es für immer. vielleicht könnte ich irgendwie eine Auszeit nehmen? – Maori
ok Ich mache Dinge mit os.open(), os.read() und fangen die Ausnahme mit errno == EAGAIN – Maori