Windows平台Python Asyncio执行后print报OSError: [WinError 6]无效句柄问题
Windows下Python异步脚本执行后print报错:OSError: [WinError 6] 句柄无效
在Windows系统使用Python 3.11.6运行包含异步函数的脚本时,执行完异步代码后所有print()语句都会抛出错误:
OSError: [WinError 6] The handle is invalid
相同代码在Linux和MacOS系统可正常运行。
原始代码
import ezkl import asyncio async def f(): res = await ezkl.calibrate_settings("input.json", "model_4.onnx", "settings.json", "resources") asyncio.run(f()) print("test")
已尝试的无效方案
使用nest_asyncio.apply()并修改事件循环策略,仍出现相同错误:
import ezkl import asyncio import nest_asyncio async def f(): res = await ezkl.calibrate_settings("input.json", "model_4.onnx", "settings.json","resources") nest_asyncio.apply() asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy()) loop = asyncio.get_event_loop() loop.run_until_complete(f()) print("test")
解决方案
问题根源是ezkl的异步函数在Windows平台下可能意外修改/关闭了主进程的标准输出句柄,导致后续IO操作失败。可通过以下方式解决:
方案1:将print语句移至异步函数内部
避免在事件循环结束后执行IO操作:
import ezkl import asyncio async def f(): res = await ezkl.calibrate_settings("input.json", "model_4.onnx", "settings.json", "resources") print("test") # 把print放在异步函数内执行 asyncio.run(f())
方案2:保存并恢复标准输出句柄
在异步执行前后备份、恢复stdout句柄,避免被ezkl修改:
import ezkl import asyncio import os import sys async def f(): res = await ezkl.calibrate_settings("input.json", "model_4.onnx", "settings.json", "resources") # 备份标准输出句柄 stdout_fd = sys.stdout.fileno() backup_fd = os.dup(stdout_fd) asyncio.run(f()) # 恢复标准输出句柄 os.dup2(backup_fd, stdout_fd) os.close(backup_fd) print("test")
方案3:用subprocess隔离ezkl执行
通过子进程运行ezkl相关逻辑,避免影响主进程的IO句柄:
import subprocess import sys # 把ezkl逻辑放到单独的脚本文件(比如run_ezkl.py)中,然后用subprocess调用 subprocess.run([sys.executable, "run_ezkl.py"], check=True) print("test")
run_ezkl.py内容:
import ezkl import asyncio async def f(): res = await ezkl.calibrate_settings("input.json", "model_4.onnx", "settings.json", "resources") asyncio.run(f())
内容的提问来源于stack exchange,提问作者finlytics-hub
相关产品推荐
相关产品推荐

