Как использовать FIFO для связи между подпроцессами Python - PullRequest
0 голосов
/ 31 марта 2012

Я пытаюсь использовать модуль подпроцесса Python (2.6) для связи между двумя внешними программами.Когда я начал качать больше данных, «клиент» перестал получать все.Я подумал, что это может быть связано с ограниченным размером объекта subprocess.PIPE (http://thraxil.org/users/anders/posts/2008/03/13/Subprocess-Hanging-PIPE-is-your-enemy/).). Поэтому я решил попробовать fifo, но он не сработал, как ожидалось. Как использовать fifo для связи между двумя внешними программами, вызываемыми изскрипт Python. В настоящее время мой скрипт останавливается на (ожидание другого конца fifo):

pipe_name = "stream-%s.fifo"%self.transponder
os.mkfifo(pipe_name)
self.stream = Popen(program1, stdout=open(pipe_name,'w'), 
                    stderr=open("test.log",'w'))

1 Ответ

2 голосов
/ 31 марта 2012

Мне не удалось заставить mkfifo работать.Однако мне удалось заставить сервер / клиента общаться через os.pipe:

#!/usr/bin/env python

from subprocess import Popen
import os
from itertools import cycle
from time import sleep
from sys import stdout, executable

def client():
    for letter in cycle('ABCDE'):
        stdout.write(letter)
        stdout.flush()
        sleep(1)


def main(argv=None):
    import sys
    from argparse import ArgumentParser

    argv = argv or sys.argv

    parser = ArgumentParser()
    parser.add_argument('--client', default=False, action='store_true')
    args = parser.parse_args(argv[1:])

    if args.client:
        client()


    r, w = os.pipe()
    pipe = Popen([executable, __file__, '--client'], stdout=os.fdopen(w, 'w'))

    try:
        client_out = os.fdopen(r, 'r')
        while True:
            letter = client_out.read(1)
            print(letter)
    except KeyboardInterrupt:
        pipe.kill()

if __name__ == '__main__':
    main()
...