等待输入时从其他线程打印()

Printing from other thread when waiting for input()

我正在尝试编写一个 shell 需要在单独的线程上 运行 套接字连接。在我的测试中,当在 cmd.Cmd.cmdloop() 等待输入时使用 print() 时,打印显示错误。

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()

当上面的命令 运行s 时,会发生以下情况:

python test.py
Welcome to Test shell.  Type help or ? to list commands.

>>asd
*** Unknown syntax: asd
>>[17:59:25] Doing test

如您所见,从另一个线程打印在提示 >> 之后添加输出,而不是换行。我怎样才能让它出现在一个新行中并出现提示?

这很难。您的两个线程共享相同的标准输出。因此,这些线程中的每一个的输出都同时发送到您的 stdout 缓冲区,在那里它们以任意顺序打印。

您需要做的是协调两个线程的输出,这是一个棘手的问题。甚至 bash 也不会那样做!

也就是说,也许您可​​以尝试使用 lock 来确保您的线程以受控方式访问 stdout。查看:http://effbot.org/zone/thread-synchronization.htm

您可以做的是,将 stdout 从您的 core.shell.Shell 重定向到类似对象的文件,例如 StringIO。您还可以将线程的输出重定向到不同的文件,如对象。

现在,您可以让第三个线程读取这两个对象并以您想要的任何方式打印出来。

你说 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()