web-dev-qa-db-ja.com

Python3.6 AttributeError:モジュール「asyncio」には属性「run」がありません

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'>
15
Jirka Svítil

asyncio.run はPython 3.7の追加です。 3.5-3.6では、例はおおよそ次のようになります。

import asyncio

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

asyncio.run()関数はPython 3.7で追加されました。 asyncio.run()関数ドキュメント から:

バージョン3.7の新機能:Important:この関数は、Python 3.7の暫定ベースでasyncioに追加されました。

provisionalpart ;に注意してくださいPythonメンテナーは、関数のさらなる調整と更新が必要になる可能性があるため、APIは将来のPythonバージョンで変更される可能性があります。

とにかく、Python 3.6では使用できません。独自のアップグレードまたは実装が必要です。

非常に単純な近似は、 loop.run_until_complete() を使用することです。

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

ただし、実行中の可能性のある残りのタスクの処理は無視されます。 asyncio.run()の完全な実装については、 asyncio.runnersソースコード を参照してください。

10
Martijn Pieters