我试图让用户使用raw_input()在控制台上输入命令,这很好。问题是我有一些后台线程,偶尔将日志信息输出到屏幕上,并且当他们这样做时,它们会弄乱输入提示(因为输出到当前光标所在的位置)。
这是一个小的Python程序,它说明了我的意思。
#!/usr/bin/env python
import threading
import time
def message_loop():
while True:
time.sleep(1)
print "Hello World"
thread = threading.Thread(target = message_loop)
thread.start()
while True:
input = raw_input("Prompt> ")
print "You typed", input
这是运行时的外观示例:
Prompt> Hello World
Hello World
Hello World
Hello World
test
You typed test
Prompt> Hello World
Hello World
Hello World
hellHello World
o
You typed hello
Prompt> Hello World
Hello World
Hello World
Hello World
我想要的是提示与线程的输出一起移动。像这样:
Hello World
Hello World
Prompt> test
You typed test
Hello World
Hello World
Hello World
Hello World
Hello World
Prompt> hello
You typed hello
Hello World
Hello World
Hello World
Hello World
Prompt>
关于如何在不使用丑陋的黑客手段的情况下实现这一目标的任何想法?:)
我最近遇到了这个问题,并希望将此解决方案留在这里以备将来参考。这些解决方案从终端清除待处理的raw_input(readline)文本,打印新文本,然后将raw_input缓冲区中的内容重新打印到终端。
第一个程序非常简单,但是仅在只有一行文本等待raw_input时才能正确运行:
#!/usr/bin/python
import time,readline,thread,sys
def noisy_thread():
while True:
time.sleep(3)
sys.stdout.write('\r'+' '*(len(readline.get_line_buffer())+2)+'\r')
print 'Interrupting text!'
sys.stdout.write('> ' + readline.get_line_buffer())
sys.stdout.flush()
thread.start_new_thread(noisy_thread, ())
while True:
s = raw_input('> ')
输出:
$ ./threads_input.py
Interrupting text!
Interrupting text!
Interrupting text!
> WELL, PRINCE, Genoa and Lucca are now no more than private estates of the Bo
Interrupting text!
> WELL, PRINCE, Genoa and Lucca are now no more than private estates of the Bo
naparte family. No, I warn you, that if you do not tell me we are at war,
第二个可以正确处理2条或更多的缓冲行,但是具有更多(标准)模块依赖性,并且需要一点点终端黑客:
#!/usr/bin/python
import time,readline,thread
import sys,struct,fcntl,termios
def blank_current_readline():
# Next line said to be reasonably portable for various Unixes
(rows,cols) = struct.unpack('hh', fcntl.ioctl(sys.stdout, termios.TIOCGWINSZ,'1234'))
text_len = len(readline.get_line_buffer())+2
# ANSI escape sequences (All VT100 except ESC[0G)
sys.stdout.write('\x1b[2K') # Clear current line
sys.stdout.write('\x1b[1A\x1b[2K'*(text_len/cols)) # Move cursor up and clear line
sys.stdout.write('\x1b[0G') # Move to start of line
def noisy_thread():
while True:
time.sleep(3)
blank_current_readline()
print 'Interrupting text!'
sys.stdout.write('> ' + readline.get_line_buffer())
sys.stdout.flush() # Needed or text doesn't show until a key is pressed
if __name__ == '__main__':
thread.start_new_thread(noisy_thread, ())
while True:
s = raw_input('> ')
输出。先前的readline行已正确清除:
$ ./threads_input2.py
Interrupting text!
Interrupting text!
Interrupting text!
Interrupting text!
> WELL, PRINCE, Genoa and Lucca are now no more than private estates of the Bo
naparte family. No, I warn you, that if you do not tell me we are at war,
问题内容: 我正在用Go编写执行大量并行计算的软件。我想从工作线程中收集数据,但我不太确定如何以安全的方式进行数据收集。我知道我可以使用通道,但是在我的场景中,它们使它变得更加复杂,因为我必须以某种方式同步主线程中的消息(等到每个线程发送了一些东西)。 情境 主线程创建 n个 实例,并在goroutine中启动其方法,以便每个工作线程都在各自的线程中运行。主线程每10秒应从工作线程中收集一些简单值
本文向大家介绍Python采用raw_input读取输入值的方法,包括了Python采用raw_input读取输入值的方法的使用技巧和注意事项,需要的朋友参考一下 本文较为详细的介绍了python中raw_input的用法,使用raw_input 能够很方便的丛控制台读入数据。具体用法示例如下: 1.输入字符串 2.输入整数 3.输入浮点型 4.输入16进制数据 5.输入8进制数据 本文示例对Py
问题内容: 我正在使用从运行约一分钟的进程中读取stdout。 我该如何stdout以流方式打印出该流程的每一行,以便可以看到生成的输出,但仍然阻止该流程终止,然后再继续? 似乎一次给出所有输出。 问题答案: 这是一个简单的示例(不检查错误): 如果ls结束太快,则while循环可能会在你读取所有数据之前结束。 你可以通过以下方式在中捕获其余部分:
问题内容: 我有一个用于Linux的Python程序,几乎像这样: 程序挂在此行: 而这种情况发生在保持更新输出的工具中,例如“ Top” 我最好的尝试: 它比第一个更好(它已经发了声),但是返回了: 第二次审判: 与第一个相同。由于“ readlines()”而挂起 它的返回应该是这样的: 并保存在变量“ process”中。我知道吗,我现在真的很困吗? 问题答案: 类似于尾巴的解决方案,仅打印
我正在开发一个应用程序(控制台),其中包含一个while循环,我希望允许用户暂停和恢复。经过一些研究,似乎一个额外的线程负责等待用户输入是正确的解决方案。 我已经能够实现持续等待输入的额外线程,并且还有一个kill方法,它设置flag变量来停止线程while()循环。不幸的是,除非有输入,否则while循环不会结束,只有在输入线程的while环至少完成一次后,这个kill标志才会生效。由于主线程也
在这个程序中,我需要用户输入是/否以在另一个数组类中设置。但字符串输入不起作用。我用整数尝试了它,它有效,但对字符串不起作用。 包装airliner.boarding.system; import java.util.Scanner; 公共舱登机{ }