【问题标题】:Python 3.8.0 Weird printing bugPython 3.8.0 奇怪的打印错误
【发布时间】:2020-01-16 16:48:48
【问题描述】:

我在使用 Threads 和 Termios 时遇到了一个非常奇怪的 print() 错误。我有一个重复的线程在打印一些东西时通过 Termios 捕获一个键。但它总是打印一个新行,它不是从行首开始,而是从最后一行结束的地方开始。

这是我的代码:

def func1():
    while True:
        try:
            var = int(inputChar())
        except ValueError:
            var = 0

Thread(target=func1).start()
while True:
    print("stuff")
    time.sleep(2)

这是我的 inputChar() 函数:

import sys, tty, termios
fd = sys.stdin.fileno()
old_settings = termios.tcgetattr(fd)
try:
    tty.setraw(sys.stdin.fileno())
    ch = sys.stdin.read(1)
finally:
    termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
return ch

这是预期的输出:

stuff
stuff
stuff
stuff
stuff

这是输出:

stuff
stuff
     stuff
          stuff
               stuff

【问题讨论】:

  • 看起来你的打印以换行结束,而不是换行。
  • 看起来像一个竞争条件;输出可能取决于在另一个线程中对tty.setrawterms.tcsetattr 的调用之间是否调用了print

标签: python python-3.x multithreading printing termios


【解决方案1】:

我不知道为什么会发生这种情况,但您可以通过将打印命令替换为

来解决它
print("stuff\r")

sys.stdout.write("stuff\n\r")

末尾的 \r 称为墨盒返回。当 sys.stdout.write() 不是一个可行的选项时,它很有用

【讨论】:

    猜你喜欢
    • 2018-08-08
    • 1970-01-01
    • 2018-10-03
    • 1970-01-01
    • 1970-01-01
    • 2016-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多