因此,我使用了一些库(不幸的是,我很懊恼)打印到stdout以获取某些调试信息。好吧,没问题,我只是禁用了它:
import sys,os
sys.stdout = open(os.devnull,'wb')
我最近添加了在终端中获取用户输入和打印输出的代码,这当然需要stdout。不过,没问题,我可以做的不是print
:
sys.__stdout__.write('text\n')
最后,由于我在一个单独的线程中执行raw_input
,并且程序的输出可能会中断用户的输入,所以我希望按照in the first part of this answer所述重新回显测试,以便使用readline.get_line_buffer()
使其更加无缝。例如,如果用户输入foobar
:
> foobar
然后另一个线程说Interrupting text!
它应该是这样的:
Interrupting text!
> foobar
但我观察到:
Interrupting text!
>
结果是readline.get_line_buffer()
始终为空,代码无法重新回显用户键入的内容。如果我删除sys.stdout
覆盖,一切都会正常工作(除了现在库的调试输出没有被阻止)。你知道吗
如果有必要的话,我将在Linux上使用python2.7。也许我想做的是不可能的,但我真的很想知道为什么会这样。在我看来,使用stdout
进行操作不应该影响stdin
行缓冲区,但我对底层库或实现并不熟悉。你知道吗
下面是一个最低限度的工作示例。只需键入一些内容,然后等待中断的文本。提示符"> "
将被重新回显,但您输入的文本不会被回显。只需注释掉第二行就可以看到它正常工作。当线程打印时,它将行缓冲区记录到stdin.log
。你知道吗
import time,readline,thread,sys,os
sys.stdout = open(os.devnull,'wb') # comment this line!
def noisy_thread():
while True:
time.sleep(5)
line = readline.get_line_buffer()
with open('stdin.log','a') as f:
f.write(time.asctime()+' | "'+line+'"\n')
sys.__stdout__.write('\r'+' '*(len(line)+2)+'\r')
sys.__stdout__.write('Interrupting text!\n')
sys.__stdout__.write('> ' + line)
sys.__stdout__.flush()
thread.start_new_thread(noisy_thread, ())
while True:
sys.__stdout__.write('> ')
s = raw_input()
在get_line_buffer()
调用之前,我也尝试过sys.stdout = sys.__stdout__
,但这也不起作用。任何帮助或解释都将不胜感激。你知道吗
当重定向stdout时,
raw_input()
停止工作。 如果在raw_input()
之前尝试sys.stdout = sys.__stdout__
,它会再次工作。 为了raw_input
工作,stdin
和stdout
都需要连接到终端。你知道吗相关问题 更多 >
编程相关推荐