95 votes

Python3.6 AttributeError : le module 'asyncio' ne possède pas d'attribut 'run'.

J'ai essayé de lire https://hackernoon.com/asynchronous-python-45df84b82434 . Il s'agit de python asynchrone et j'ai essayé le code de ce document, mais j'obtiens 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'essaie de l'exécuter, il 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 des preuves :

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

121voto

Norrius Points 2592

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

import asyncio

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

10 votes

Quand vous prenez la boucle d'événement existante, je ne la fermerais pas asyncio.run() ne fait que fermer la boucle car elle crée en fait une nouvelle boucle pour commencer.

0 votes

Vous pouvez utiliser asyncio.gather au lieu de asyncio.wait pour consommer réellement les futures et gérer les exceptions.

56voto

Martijn Pieters Points 271458

Le site asyncio.run() a été ajoutée dans Python 3.7. De la asyncio.run() documentation des fonctions :

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

Notez le provisoirement partie les mainteneurs de Python prévoient que la fonction peut nécessiter d'autres ajustements et mises à jour, de sorte que l'API peut changer dans les futures versions de Python.

En tout cas, vous ne pouvez pas l'utiliser avec Python 3.6. Vous devrez faire une mise à jour ou implémenter le vôtre.

Une approximation très simple serait d'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 autres tâches qui peuvent encore être en cours. Voir le asyncio.runners code source pour l'ensemble des asyncio.run() mise en œuvre.

10voto

Charlie Parker Points 715

Juste au cas où cela serait utile à quelqu'un d'autre, mais pour moi le problème était que mon fichier s'appelait asyncio.py . Je l'ai renommé en asyncio_example.py et il a recommencé à fonctionner (il échouait au niveau de l'instruction d'importation pour asyncio).

Ce numéro m'a permis de le réaliser : https://github.com/tornadoweb/tornado/issues/2868

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X