使用aiofiles异步删文件遇TypeError:NoneType不可用于await表达式
解决异步删除文件时的
TypeError: object NoneType can't be used in 'await' expression 错误 嘿,我来帮你理清这个问题的根源和解决办法!
你遇到这个错误的核心原因很明确:在aiofiles 0.5.0版本中,aiofiles.os.remove() 并不是一个异步可等待函数。这个版本的aiofiles.os只是对标准库os模块的简单包装,它的remove方法还是同步执行的,调用后直接返回None——而await关键字只能用于等待协程、Future这类可等待对象,试图await一个None自然就触发了这个类型错误。
下面给你两种实用的解决方案:
方案1:用asyncio线程池包装同步删除操作
因为文件删除这类系统操作本身没有原生异步API,我们可以借助asyncio的线程池,把同步的os.remove包装成异步可等待的任务,完美契合你的异步代码逻辑:
import asyncio import os async def delete_local_file(file_to_del): # 获取当前事件循环 loop = asyncio.get_event_loop() # 在线程池中执行同步删除操作 await loop.run_in_executor(None, os.remove, file_to_del) print(f"deleted: {file_to_del}") # 注意:await必须在异步函数内执行,所以要写个主函数 async def main(): await delete_local_file(localfile) # Python 3.6的话用这个方式启动事件循环 loop = asyncio.get_event_loop() loop.run_until_complete(main())
方案2:升级aiofiles到支持异步文件系统操作的版本
如果你不想手动处理线程池,可以升级aiofiles到0.8.0及以上版本——新版本的aiofiles.os已经封装了异步的文件系统操作(底层还是用线程池实现,但调用起来更简洁):
先升级包:
pip install --upgrade aiofiles
然后修改你的代码:
import aiofiles.os as aio_os async def delete_local_file(file_to_del): await aio_os.remove(file_to_del) print(f"deleted: {file_to_del}") # 同样要在异步上下文里调用 async def main(): await delete_local_file(localfile) loop = asyncio.get_event_loop() loop.run_until_complete(main())
最后提醒一下:你原代码里直接在顶层写await delete_local_file(localfile)是不符合Python异步规则的,await只能出现在异步函数内部,必须把调用逻辑放到异步主函数中,再通过事件循环启动,这点一定要注意哦!
内容的提问来源于stack exchange,提问作者user1528465
相关产品推荐
相关产品推荐

