导入 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 会引发错误的主要内容,如果未能解决你的问题,请参考以下文章
ROS ImportError:没有名为 asyncio 的模块
如何在 Python 3.8 中为 asyncio.gather 构建任务列表
理解和调试 `asyncio.TimeoutError from None` 错误