web-dev-qa-db-fra.com

Python3.6 AttributeError: le module 'asyncio' n'a pas d'attribut 'run'

J'ai essayé de lire https://hackernoon.com/asynchronous-python-45df84b82434 . C'est à peu près asynchrone python et j'ai essayé le code à partir de ça, mais je reçois une erreur bizarre. Le code est: `

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

Quand j'essaye de courir, ça dit:

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

Je n'ai aucun fichier nommé ayncio et j'ai la preuve:

>>> asyncio
<module 'asyncio' from '/usr/lib/python3.6/asyncio/__init__.py'>
15
Jirka Svítil

asyncio.run est un ajout Python 3.7. En 3.5-3.6, votre exemple équivaut à peu près à:

import asyncio

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

La fonction asyncio.run() a été ajoutée dans Python 3.7. À partir de la documentation asyncio.run() de la fonction) :

Nouveauté de la version 3.7: Important : cette fonction a été ajoutée à asyncio dans Python 3.7 à titre provisoire.

Notez la provisoire partie ; Les mainteneurs Python prévoient que la fonction peut nécessiter des ajustements et des mises à jour plus poussés, de sorte que l'API puisse changer à l'avenir Python.

De toute façon, vous ne pouvez pas l'utiliser sur Python 3.6. Vous devrez mettre à jour ou implémenter votre propre.

Une approximation très simple consisterait à utiliser loop.run_until_complete() :

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

bien que cela ne tienne pas compte de la gestion des tâches restantes en cours d’exécution. Voir le _asyncio.runners_ code source pour la mise en oeuvre complète de asyncio.run().

10
Martijn Pieters