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

2024-09-27 22:20:44 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我想做一个写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程序。在

^{pr2}$

当前的问题是,虽然它将运行,但stdout永远不会被打印出来。在


Tags: fromimportself程序truestreamqueuemain
1条回答
网友
1楼 · 发布于 2024-09-27 22:20:44

看起来您的主要问题是调用了两个stream_talker(),而不是stream_watcher()。在

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

最后,如果您在stream_talker()中编写stream参数,而不是硬编码,那么您可能会避免一些将来的困惑自我程序标准. 在

相关问题 更多 >

    热门问题