python 中打印函数的错误?

A bug of print function in python?

from socket import *
from threading import Thread

udp_socket = None
dest_ip = ''
dest_port = 0


def send():
    while True:
        content = input('<<<')
        udp_socket.sendto(content.encode(), (dest_ip, dest_port))


def recv():
    while True:
        data = udp_socket.recvfrom(1024)
        content, address = data
        ip, port = address
        print('\r>>>[%s %d] %s' % (ip, port, content.decode()))
        print('<<<', end='')


def main():
    global udp_socket, dest_ip, dest_port
    udp_socket = socket(AF_INET, SOCK_DGRAM)
    udp_socket.bind(('', 7788))

    dest_ip = input('Please enter the IP: ')
    dest_port = int(input('Please enter the port: '))

    ts = Thread(target=send)
    tr = Thread(target=recv)
    ts.start()
    tr.start()


if __name__ == '__main__':
    main()

调用recv()时,不会打印出print('<<<', end='') 。有谁知道背后的原因吗?顺便说一下,我在Pycharm IDE 和Linux OS 中都运行。但是这个错误出现在两者中。

不,这不是错误。您的 stdout 流是 行缓冲 并且在打印 \n 换行符之前不会自动刷新。数据已写入缓冲区,但在刷新缓冲区之前不会写入屏幕。

flush=True 添加到 print() 调用以强制手动刷新:

print('<<<', end='', flush=True)

stdoutcommonly line-buffered when connected to a terminal,否则是块缓冲;线路缓冲在避免终端更新过于频繁和及时向用户提供信息之间取得平衡。