在python中杀死stdout会中断get\u line\u buffer()

2024-09-29 19:33:36 发布

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

因此,我使用了一些库(不幸的是,我很懊恼)打印到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__,但这也不起作用。任何帮助或解释都将不胜感激。你知道吗


Tags: text用户readlinegetosbufferstdoutsys
1条回答
网友
1楼 · 发布于 2024-09-29 19:33:36

当重定向stdout时,raw_input()停止工作。 如果在raw_input()之前尝试sys.stdout = sys.__stdout__,它会再次工作。 为了raw_input工作,stdinstdout都需要连接到终端。你知道吗

相关问题 更多 >

    热门问题