Python3.6 AttributeError: module 'asyncio' has no attribute 'run'

PythonPython 3.6Python Asyncio

Python Problem Overview


I tried to read https://hackernoon.com/asynchronous-python-45df84b82434. It's about asynchronous python and I tried the code from this, but I'm getting a weird Error. The code is: `

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))

When I try to run it says:

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

I dont have any files named ayncio and I have proof:

>>> asyncio
<module 'asyncio' from '/usr/lib/python3.6/asyncio/__init__.py'>

Python Solutions


Solution 1 - Python

asyncio.run is a Python 3.7 addition. In 3.5-3.6, your example is roughly equivalent to:

import asyncio

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

Solution 2 - Python

The asyncio.run() function was added in Python 3.7. From the asyncio.run() function documentation:

> New in version 3.7: Important: this function has been added to asyncio in Python 3.7 on a provisional basis.

Note the provisional part; the Python maintainers forsee that the function may need further tweaking and updating, so the API may change in future Python versions.

At any rate, you can't use it on Python 3.6. You'll have to upgrade or implement your own.

A very simple approximation would be to use loop.run_until_complete():

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

although this ignores handling remaining tasks that may still be running. See the asyncio.runners source code for the complete asyncio.run() implementation.

Solution 3 - Python

Just in case this is useful to someone else but for me the issue was my file was called asyncio.py. I renamed it to asyncio_example.py and it started to work again (it was failing at the import statement for asyncio).

This issue helped me realize this: https://github.com/tornadoweb/tornado/issues/2868

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionJirka Sv&#237;tilView Question on Stackoverflow
Solution 1 - PythonNorriusView Answer on Stackoverflow
Solution 2 - PythonMartijn PietersView Answer on Stackoverflow
Solution 3 - PythonCharlie ParkerView Answer on Stackoverflow