Я новичок в нарезке, поэтому чувствую, что мне не хватает очевидного момента, но я не мог найти предыдущий вопрос, относящийся к этой теме.Одновременно чтение stdin и запись в stdout в python
Я хочу сделать программу, которая пишет в stdin и читает stdout программы 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;
}
Текущая проблема заключается в том, что, хотя она будет работать, стандартный вывод никогда не печатается.
Вы пытались промыть буферы (с обоих концов)? –
1. Вы используете 'stream_talker' дважды. Вы также хотите запустить 'stream_watcher'. 2. [Вы должны принудительно настроить буферизацию строки] (http://stackoverflow.com/q/20503671/4279) 3. Это [достаточно, чтобы запустить один поток для одновременного ввода и чтения вывода) (http: //stackoverflow.com/q/28291847/4279) – jfs
@JFSebastian Я изучаю оба этих ответа, теперь спасибо за ссылки. –