如何使Python的print()函数非阻塞?

3

我正在Raspberry Pi上运行一个Python脚本,但在print()调用时出现间歇性的冻结。脚本只会偶尔冻结,当有人关注终端并按下"Enter"按钮或按下ctrl+c时才会继续运行。

我猜测问题在于print()调用正在等待从终端获得某种响应,而用户进行了意外操作时(例如高亮文本、右键拖动或其他未知操作),它无法获取响应(我无法复制这些操作)。需要明确的是,在这种情况下,脚本会无限期地挂起,而不是直接下方的time.sleep()调用中指定的120秒。

我的问题是:有没有可以在Python中使用的print()调用,它不会等待从控制台返回响应,以便在像上面那样的未知情况下不会冻结?

我已经将代码放在下面,尽管它具体做什么与问题不太相关。

while True:
    directory_pump_files =  glob.glob("./pumplog*.csv") #read in some files from the file system

    for file_path in directory_pump_files:
        try_upload_file(file_path, pump_files_done, "/batchUpload/create") #upload the pump file

        
    directory_log_files =  glob.glob("./log*.csv")

    for file_path in directory_log_files:
        try_upload_file(file_path, log_files_done, "/batchUpload/SensorReadings") #upload the log file
    print ("sleep")
    time.sleep(120)

2
print调用后跟着一个time.sleep。是不是sleep导致你的程序暂停和"冻结"了一段时间? - Gino Mempin
程序无限期挂起,不仅仅是在time.sleep指定的120秒内。感谢您澄清这一点 - 我已经编辑了问题以使其更易理解。 - Jack
1
什么是消耗stdout?当它无限期地挂起时,是否已输出“sleep”?听起来像是缓冲 - 如果输出缓冲区满了,写入该缓冲区会被阻塞。假设缓冲区的使用者没有清空它。考虑使缓冲区(大大)变大 - 但如果使用者真的很慢,那只会推迟缓冲区满的情况,即print()仍然会被阻塞。真正的问题是缓冲区的使用者。 - DisappointedByUnaccountableMod
1
当它无限期地挂起时,是否已输出“sleep”? - DisappointedByUnaccountableMod
的确是这样,尽管循环的本质是每两分钟输出“sleep”,并且每小时从文件系统获取一个新文件。 因此,我在终端中所看到的只是一个上传文件的通知,然后是一堆“sleep”语句,最后是一个卡住的状态。 因此,我没有证据表明它在哪个语句上断开连接,因为我从终端中看到的只是一堆显示“sleep”的行。 我只是推断这是一个终端问题,因为ctrl+c似乎清除了脚本的运行以继续运行。 - Jack
显示剩余2条评论
1个回答

2
可能是终端的缓冲机制出了问题。通常情况下,当遇到换行符时,缓冲区会被刷新,但在树莓派上可能会有不同的工作方式。
您可以尝试使用“flush”参数。从“help(print)”中得知:
print(...)
    print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)
    
    Prints the values to a stream, or to sys.stdout by default.
    Optional keyword arguments:
    file:  a file-like object (stream); defaults to the current sys.stdout.
    sep:   string inserted between values, default a space.
    end:   string appended after the last value, default a newline.
    flush: whether to forcibly flush the stream.
通过使用print("sleep", flush=True),字符串将会立即打印出来。

嗨Jaap,谢谢你的回答。我会更新我的脚本并看看效果如何。 - Jack

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接