我正在尝试编写一个需要在单独的线程上运行套接字连接的shell。在我的测试中,当print()
等待输入时使用cmd.Cmd.cmdloop()
时,打印显示错误。
from core.shell import Shell
import time
import threading
def test(shell):
time.sleep(2)
shell.write('Doing test')
if __name__ == '__main__':
shell = Shell(None, None)
testThrd = threading.Thread(target=test, args=(shell,))
testThrd.start()
shell.cmdloop()
上面的命令运行时,将发生以下情况:
python test.py
Welcome to Test shell. Type help or ? to list commands.
>>asd
*** Unknown syntax: asd
>>[17:59:25] Doing test
如您所见,从其他线程进行打印会在提示符>>
之后添加输出,而不是在新行中。我该如何做才能使其出现在新行中并出现提示?
答案 0 :(得分:1)
您可以做的是将stdout
从您的core.shell.Shell
重定向到诸如StringIO之类的文件。您还可以将线程的输出重定向到其他文件(例如object)。
现在,您可以让一些第三线程读取这两个对象并以您想要的任何方式将它们打印出来。
您说过core.shell.Shell
继承自cmd.Cmd
,它允许将重定向作为参数传递给构造函数:
import io
import time
import threading
from core.shell import Shell
def test(output_obj):
time.sleep(2)
print('Doing test', file=output_obj)
cmd_output = io.StringIO()
thr_output = io.StringIO()
shell = Shell(stdout=cmd_output)
testThrd = threading.Thread(target=test, args=(thr_output,))
testThrd.start()
# in some other process/thread
cmd_line = cmd_output.readline()
thr_line = thr_output.readline()
答案 1 :(得分:0)
这很困难。您的两个线程共享同一个标准输出。因此,这些线程中的每个线程的输出会同时发送到您的stdout缓冲区,并以任意顺序将它们打印出来。
您需要做的是协调两个线程的输出,这很难破解。甚至bash
都不这样做!
也就是说,也许您可以尝试使用lock
来确保您的线程以受控方式访问stdout
。检出:http://effbot.org/zone/thread-synchronization.htm