为什么 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 中的行缓冲区。
当我 运行 一个带有 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 中的行缓冲区。