导入asyncio模块报错:原因排查与解决方法
Python 3.6 导入asyncio 报错:AttributeError: module 'asyncio.tasks' has no attribute 'all'
我在终端测试asyncio时碰到了这个棘手的问题,操作过程如下:
$ python3.6 Python 3.6.2 (v3.6.2:5fd33b5926, Jul 16 2017, 20:11:06) [GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> import asyncio
执行import asyncio后立刻抛出了错误,回溯信息如下:
Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/asyncio/__init__.py", line 42, in <module> tasks.__all__ + AttributeError: module 'asyncio.tasks' has no attribute '__all__'
我在Python 3.5环境下执行完全相同的操作是正常的,所以怀疑是不是Python 3.6的asyncio库文件损坏了?另外我用-v参数运行Python后,导入asyncio的输出内容较多,这里就不贴出全部内容了。
报错原因
你的怀疑是对的,这个问题几乎可以确定是asyncio.tasks模块文件损坏或被篡改导致的。在Python 3.6的asyncio源码中,__init__.py的第42行需要引用tasks.__all__来合并模块对外暴露的成员列表——正常情况下,asyncio/tasks.py文件里是明确定义了__all__变量的,用来声明模块的公共接口。如果这个变量消失,要么是文件被误编辑删除了相关代码,要么是文件本身损坏导致内容缺失。
当然也不排除是当初安装Python 3.6时,asyncio模块的文件没有被完整部署的可能。
解决办法
给你几个按优先级排序的解决步骤:
手动修复tasks.py文件
- 找到Python 3.6安装路径下的
asyncio/tasks.py,路径就是报错里的/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/asyncio/tasks.py - 打开文件后,检查开头部分是否有类似这样的代码块:
如果没有,就手动添加这段代码(或者直接从Python官方的3.6分支源码中复制完整的__all__ = [ 'Task', 'create_task', 'sleep', 'wait', 'wait_for', 'gather', 'shield', 'ensure_future', 'as_completed', ]tasks.py内容替换本地文件) - 保存文件后重启Python 3.6,尝试导入asyncio验证是否恢复正常。
- 找到Python 3.6安装路径下的
重新安装Python 3.6.2
- 如果手动修复无效,或者你不确定如何修改源码,最稳妥的办法就是卸载当前的Python 3.6,然后从官方渠道下载对应版本的安装包重新安装。安装过程中确保网络稳定,不要中断安装流程。
验证安装完整性
- 重新安装完成后,可以执行
python3.6 -m ensurepip --upgrade确保pip及相关依赖完整,再用python3.6 -c "import asyncio; print('Import successful!')"快速验证asyncio是否能正常导入。
- 重新安装完成后,可以执行
内容的提问来源于stack exchange,提问作者AAM111
相关产品推荐
相关产品推荐

