在 python 中同时读取标准输入和写入标准输出

Simultaneously reading stdin and writing to stdout in python

我是线程的新手,所以我觉得我好像遗漏了一个明显的观点,但我找不到与此主题相关的先前问题。

我想制作一个写入标准输入并读取 c 程序标准输出的程序。这是主程序中的代码。

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;

}

当前的问题是,虽然它会 运行,但永远不会打印标准输出。

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

此外,您可能不想在队列上忙等待(因为这违背了使用队列的全部意义)。您的代码会尽可能快地轮询 chatter.empty(),直到队列中有内容为止。直接使用 chatter.get() 代替;它会阻塞,直到有可用的东西或达到你的超时。

最后,如果您写入 stream_talker() 中的 stream 参数,而不是硬编码 self.proc.stdin.

,您可能会避免一些未来的困惑