我正在用 python 命令行模拟器编写一个 GTK+ GUI 程序。我的python命令行实现为gtk.TextView,可用于输出结果prints
(并从TextView和exec
它们读取命令,但我不在这里发布输入部分,因为它与问题无关) .
我使用以下技术stdout
在真实终端和我的 python 命令行之间建立流:
r_out, w_out = os.pipe() # create a pipe, cause sys.stdout is unreadable, thus we can't poll it for available output
w_out_stream = os.fdopen(w_out, "w", 0) # open write-end of pipe with 0-length buffer
sys.stdout = w_out_stream # now prints and sys.stdout.writes would go to the pipe
watch = gobject.io_add_watch(r_out, gobject.IO_IN, stdout_callback) # poll the read-end of pipe for data and call stdout_callback
def stdout_callback(stream, condition):
data = os.read(stream, 1) # read the pipe byte-by-byte
iter = textbuf.get_end_iter() # textbuf is buffer of TextView, the GUI widget, I use as python command line
textbuf.insert(iter, data) # output stdout to GUI
sys.__stdout__.write(data) # output stdout to "real" terminal stdout
gtk.main()
这适用于小输出。但不幸的是,当输出变得相对较大(如数千字节)时,我的应用程序挂起并且不显示任何输出。
但是,如果我发送SIGINT
,我的输出会同时出现在 GUI 和真实终端中。显然,我希望它没有 SIGINT。任何想法,是什么导致这样的块?