为什么 asyncio 在 cmd 中工作,但在 Git Bash 中不工作?

Why does asyncio work in cmd but not in Git Bash?

当我 运行 一个带有 asyncio 的 python 模块时,它在从 cmd 执行时按预期工作,但在从 git bash.[=13 执行时却没有=]

该代码旨在打印“hello”,等待 3 秒,然后打印“world”。它在 cmd 中正确执行此操作,但在 git bash 中,它首先等待三秒钟,然后连续打印两个语句。

代码如下:

import asyncio

async def main():
    print('hello')
    await asyncio.sleep(3)
    print('world')

asyncio.run(main())

git bash 对待 I/O 的方式是否有某些内在因素导致了这种行为?

我在 Windows 10 上使用 Python 3.10.2。Git 版本 2.24.1.windows.2.

根据 Mofi 的评论,我将代码更改为:

import asyncio

async def main():
    print('hello', flush=True)
    await asyncio.sleep(3)
    print('world', flush=True)

asyncio.run(main())

这会强制缓冲区在两次打印后刷新,并将其发送到终端。现在可以在 Git Bash 中使用。

详情: 根据我现在的理解,在幕后,python 根据检测到的设备设置缓冲。从 https://docs.python.org/2/library/functions.html#open 开始,文件“通常对 tty 设备进行行缓冲,对其他文件进行完全缓冲”。 Print 使用默认的 sys.stdout 文件对象写入。

运行 一个新模块,代码如下: 导入系统

print(f'{sys.stdout.isatty()=}')

它在 cmd 中打印 'sys.stdout.isatty()=True' 但在 git bash 中打印 'sys.stdout.isatty()=False',这解释了为什么 stdout 选择在 git bash 中完全缓冲], 直到代码退出才打印,cmd 中的行缓冲区。