导入 asyncio 会引发错误

Posted

技术标签:

【中文标题】导入 asyncio 会引发错误【英文标题】:Importing asyncio throws error 【发布时间】:2018-05-19 19:17:19 【问题描述】:

在我的终端中,我想用 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 解释器并且没有出错,所以可能是库损坏了?)

我用-v开关运行Python,在提示符下运行import asyncio后产生的输出相当大,所以它在this GitHub gist中可用。

【问题讨论】:

显示完整的 Python 版本 python 3.6.2.我会补充的。 尝试 brew upgrade python3 那是……出乎意料。看起来您可能有一个本地 asyncio.tasks 模块隐藏内置版本?您是否有可能有一个asyncio 目录其中没有__init__.py 文件,但有一个tasks.py 文件? 不,我绝对不。 @GregEremeev 现在就这样做。 【参考方案1】:

您的本地安装已损坏。从您提供的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>

bytecode is stale 消息意味着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 installer 重新安装 Python,但此时我只需要使用 newer 3.6.5 release。

您也可以尝试通过下载original source from the v3.6.2 tag 来恢复原始内容,但是您必须确保重新生成字节码(运行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

【讨论】:

【参考方案2】:

好像是个bug

尝试通过 brew 升级你的 Python

brew upgrade python3

目前Python 3.6.5可用,没有这个问题

【讨论】:

我现在正在尝试。 ...错误,python3 没有安装?那我一开始是怎么拥有python的呢? @OldBunny2800 哪个错误?尝试 brew doctor ,然后 brew upgrade python3 不,还是Error: python3 not installed @OldBunny2800 然后 brew install python3.你有默认的 Python3,它是你操作系统的一部分。 brew 会将额外的 Python 安装到另一个目录,不用担心。

以上是关于导入 asyncio 会引发错误的主要内容,如果未能解决你的问题,请参考以下文章

Python3 Asyncio 在并发任务之间共享资源

ROS ImportError:没有名为 asyncio 的模块

如何在 Python 3.8 中为 asyncio.gather 构建任务列表

理解和调试 `asyncio.TimeoutError from None` 错误

如何修复'错误:asyncio:任务已被破坏,但它正在等待处理! Python中的错误

Asyncio RuntimeError:事件循环已关闭