Python3.6 AttributeError:模块“asyncio”没有属性“run”

问题描述 投票:0回答:5

我尝试阅读https://hackernoon.com/asynchronous-python-45df84b82434。 这是关于异步 python 的,我尝试了其中的代码,但出现了一个奇怪的错误。 代码是: `

import asyncio
import aiohttp

urls = ['http://www.google.com', 'http://www.yandex.ru', 'http://www.python.org']

async def call_url(url):
    print('Starting {}'.format(url))
    response = await aiohttp.ClientSession().get(url)
    data = await response.text()
    print('{}: {} bytes: {}'.format(url, len(data), data))
    return data

futures = [call_url(url) for url in urls]

asyncio.run(asyncio.wait(futures))

当我尝试运行时,它说:

Traceback (most recent call last):
  File "test.py", line 15, in <module>
    asyncio.run(asyncio.wait(futures))
AttributeError: module 'asyncio' has no attribute 'run'
sys:1: RuntimeWarning: coroutine 'call_url' was never awaited

我没有任何名为 ayncio 的文件,但我有证据:

>>> asyncio
<module 'asyncio' from '/usr/lib/python3.6/asyncio/__init__.py'>
python python-3.6 python-asyncio
5个回答
122
投票

asyncio.run
是 Python 3.7 的新增功能。在 3.5-3.6 中,你的例子大致相当于:

import asyncio

futures = [...]
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(futures))

56
投票

Python 3.7 中添加了

asyncio.run()
函数。来自
asyncio.run()
函数文档

3.7版本新增: 重要:该函数已临时添加到Python 3.7中的asyncio中。

注意临时部分; Python 维护者预计该函数可能需要进一步调整和更新,因此 API 可能会在未来的 Python 版本中发生变化。

无论如何,你不能在Python 3.6上使用它。您必须升级或实施自己的。

一个非常简单的近似方法是使用

loop.run_until_complete()
:

loop = asyncio.get_event_loop()
result = loop.run_until_complete(coro)

尽管这会忽略处理可能仍在运行的剩余任务。请参阅

asyncio.runners
源代码,了解完整的
asyncio.run()
实现。


14
投票

以防万一这对其他人有用,但对我来说问题是我的文件被称为

asyncio.py
。我将其重命名为
asyncio_example.py
,它再次开始工作(它在 asyncio 的导入语句中失败)。

这个问题帮助我认识到了这一点:https://github.com/tornadoweb/tornado/issues/2868


1
投票

如果有人遇到没有电流循环的问题,请尝试:

loop = asyncio.**new**_event_loop()

result = loop.run_until_complete(coro)

0
投票

AttributeError:部分初始化的模块“asyncio”没有属性“run”(很可能是由于循环导入) !!!!!!!!!!!! 确保您的文件未命名为 asyncio.py 。这可能会导致与内置的 async io 模块发生冲突。

© www.soinside.com 2019 - 2024. All rights reserved.