【问题标题】:Importing asyncio throws error导入 asyncio 会引发错误
【发布时间】: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 现在就这样做。

标签: python python-import python-3.6 importerror python-asyncio


【解决方案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 安装到另一个目录,不用担心。
    猜你喜欢
    • 2018-02-23
    • 2019-07-03
    • 2019-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多