同时读取stdin并在python中写入stdout

时间:2015-02-11 17:13:15

标签: python subprocess

我是线程新手,所以我觉得我错过了一个明显的观点,但我找不到与之相关的先前问题。

我想创建一个写入stdin的程序并读取一个c程序的stdout。这是主程序中的代码。

from subprocess import Popen, PIPE
from threading import Thread
from Queue import Queue, Empty
from os import getcwd
import time
import random

chatter = Queue(maxsize=10)  # Queue of strings to be sent to the program


class Chatter():
    def stream_talker(self, identifier, stream):
        while True:
            if not chatter.empty():
                self.proc.stdin.write(chatter.get(True, 1))

    def stream_watcher(self, identifier, stream):
        while True:
            for line in stream:
                print line

    def main(self):
        self.proc = Popen(getcwd() + '/main', stdout=PIPE, stdin=PIPE)
        Thread(target=self.stream_talker, name='stdin-talker', args=('STDIN', self.proc.stdin)).start()
        Thread(target=self.stream_watcher, name='stdout-listening', args=('STDOUT', self.proc.stdout)).start()

        while True:
            chat = raw_input('Enter chatter: ')
            if len(chat) > 0:
                chatter.put(chat)


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

这是它调用的main.c程序。

#include <stdio.h>
#include <stdlib.h>

int main(){
  while (1){
    int bytes_read;
    size_t nbytes = 100;
    char *my_string;

    my_string = (char *)malloc(nbytes + 1);
    bytes_read = getline (&my_string, &nbytes, stdin);

    if (bytes_read == -1)
    {
      puts ("ERROR!");
    }
    else{
      puts (my_string);
    }
    free(my_string);
  }

  return 0;

}

目前的问题是,虽然它会运行,但从未打印过stdout。

1 个答案:

答案 0 :(得分:3)

看起来您的主要问题是您调用了两个stream_talker()而没有stream_watcher()

此外,您可能不想忙于等待您的队列(因为这违背了使用队列的全部要点)。您的代码尽可能快地轮询chatter.empty(),直到队列中包含某些内容。直接使用chatter.get();它将阻止,直到某些东西可用或直到它超时。

最后,如果您写入stream中的stream_talker()参数,而不是硬编码self.proc.stdin,您可能会为自己节省一些混淆。