首页 > 解决方案 > 导入 asyncio 会引发错误

问题描述

在我的终端中,我想用 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

这引发了如下错误:

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 解释器并且没有出错,所以可能是库损坏了?)

我已经用-vswitch运行了 Python,import asyncio在提示符下运行后产生的输出相当大,所以它在这个 GitHub gist中可用。

标签: pythonpython-importpython-3.6importerrorpython-asyncio

解决方案


您的本地安装已损坏。从python -v您提供的输出中:

# bytecode is stale for 'asyncio.tasks'
# code object from /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/asyncio/tasks.py
import 'asyncio.tasks' # <_frozen_importlib_external.SourceFileLoader object at 0x104cf7860>

字节码是陈旧的消息意味着asyncio/tasks.py文件比随附的文件asyncio/__pycache__/tasks.cpython-36.pyc。这表明某些东西已经改变了tasks.py文件,导致内容与 Python 二进制文件附带的内容不同。

为了比较,兄弟模块asyncio.events是从字节码缓存中加载的,该缓存由 Python 安装程序在安装时提供:

# code object from '/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/asyncio/__pycache__/events.cpython-36.pyc'
import 'asyncio.events' # <_frozen_importlib_external.SourceFileLoader object at 0x104ccf4e0>

该模块的代码对象是从asyncio/__pycache__/events.cpython-36.pyc文件中加载的。

您可以从OS X 安装程序重新安装 Python ,但此时我只需获取较新的 3.6.5 版本即可。

您也可以尝试通过从 v3.6.2 标签下载原始源来恢复原始内容,但是您必须确保重新生成(运行sudo python -m compileall /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/asyncio/tasks.py)字节码,并且您需要检查任何其他此类更改的文件(尝试find /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6 -name \*.py -newer /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/asyncio/__init__.py


推荐阅读