2016-08-29 4 views
1

Dieser Code verwendet:AssertionError: Ertrag aus nicht mit zukünftigen

import asyncio 
async def wee(): 
    address = 'localhost' 
    port = 5432 
    reader, writer = asyncio.open_connection(address, port) 
    message = '/t' 
    print('Send: %r' % message) 
    writer.write(message.encode()) 

async def main(): 
    t2 = asyncio.ensure_future(wee()) 
    await t2 

if __name__ == "__main__": 
    loop = asyncio.get_event_loop() 
    loop.run_until_complete(main()) 

... erzeugt einen Fehler AssertionError: Ertrag aus nicht mit zukünftigen mit dieser Zurückverfolgungs verwendet wurde:

Traceback (most recent call last): 
    File "ssh_as.py", line 20, in <module> 
    loop.run_until_complete(main()) 
    File "/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/lib/python3.5/asyncio/base_events.py", line 337, in run_until_complete 
    return future.result() 
    File "/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/lib/python3.5/asyncio/futures.py", line 274, in result 
    raise self._exception 
    File "/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/lib/python3.5/asyncio/tasks.py", line 241, in _step 
    result = coro.throw(exc) 
    File "ssh_as.py", line 16, in main 
    await t2 
    File "/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/lib/python3.5/asyncio/futures.py", line 358, in __iter__ 
    yield self # This tells Task to wait for completion. 
    File "/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/lib/python3.5/asyncio/tasks.py", line 290, in _wakeup 
    future.result() 
    File "/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/lib/python3.5/asyncio/futures.py", line 274, in result 
    raise self._exception 
    File "/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/lib/python3.5/asyncio/tasks.py", line 239, in _step 
    result = coro.send(None) 
    File "ssh_as.py", line 9, in wee 
    reader, writer = asyncio.open_connection(address, port) 
    File "/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/lib/python3.5/asyncio/streams.py", line 64, in open_connection 
    lambda: protocol, host, port, **kwds) 
    File "/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/lib/python3.5/asyncio/base_events.py", line 599, in create_connection 
    yield from tasks.wait(fs, loop=self) 
    File "/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/lib/python3.5/asyncio/tasks.py", line 341, in wait 
    return (yield from _wait(fs, timeout, return_when, loop)) 
    File "/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/lib/python3.5/asyncio/tasks.py", line 424, in _wait 
    yield from waiter 
    File "/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/lib/python3.5/asyncio/futures.py", line 359, in __iter__ 
    assert self.done(), "yield from wasn't used with future" 
AssertionError: yield from wasn't used with future 

Wenn ich nur eine Variable anstelle des Entpacken asyncio.open_connection zu Reader, Writer und nur dummy=asyncio.open_connection(... verwenden, gibt es keinen solchen Fehler, obwohl dummy Objekt nicht als StreamReader der Dokumentation sowie TypeError: 'generator' object is not subscriptable verwendbar ist. Absolut keine Ahnung was passiert, bitte helft.

Antwort

3

Sie müssen die asyncio.open_connection(address, port) Zeile zu await asyncio.open_connection(address, port) ändern. Offene Verbindung gibt eine Zukunft/Versprechen usw. zurück und Sie müssen auf dieses Ergebnis "warten", um auf seinen Inhalt zugreifen zu können.