Seite 1 von 1

Fehler: RuntimeWarning: coroutine 'main' was never awaited

Verfasst: Dienstag 23. August 2022, 07:25
von bachatero18
Hallo zusammen,

ich wollte nach BLE devices mal in Endlosschleife suchen lassen in dem ich die Funktion immer wieder aufrufe. Hintergrund dabei ist, wie stabil und sicher das Suchen geht und vor allem welchen Einfluss "asyncio.sleep(10.0)" hat wenn man die hoch und runterschraubt.

Bekomme aber dann den Fehler und ich habe schon gegooglt konnte mir dabei aber nicht selber Helfen, da ich vorher mit async noch nicht gemacht habe.
RuntimeWarning: coroutine 'main' was never awaited
Habt ihr eine Lösung?

Code: Alles auswählen

import asyncio
from bleak import BleakScanner

async def main(): 

    async with BleakScanner() as scanner:
        await asyncio.sleep(10.0) 
    
    for d in scanner.discovered_devices: 

        print(d)

    main()

asyncio.run(main())[code]

Re: Fehler: RuntimeWarning: coroutine 'main' was never awaited

Verfasst: Dienstag 23. August 2022, 07:35
von __deets__
Na du rufst main einfach auf. Das ist aber eine async Funktion. Die muss awaited werden. Was die Fehlermeldung doch klar sagt.

Aber wenn du das machst, hast du einen Bug programmiert. Denn du erzeugst eine Rekursion, statt einer Endlosschleife. Warum benutzt du nicht einfach while?

Re: Fehler: RuntimeWarning: coroutine 'main' was never awaited

Verfasst: Dienstag 23. August 2022, 07:45
von bachatero18
Im Endeffekt soll das Skript von einem anderen Skript aufgerufen werden. Wenn dann nicht das gesuchte Gerät drin ist nochmal aufrufen aber das maximal 5 mal und dann eine Fehlermeldung geben. While schleife könnte ich machen ja aber habe ich das selbe Problem dann nicht später trotzdem?

Re: Fehler: RuntimeWarning: coroutine 'main' was never awaited

Verfasst: Dienstag 23. August 2022, 07:54
von __deets__
Ich kann nur Stellung nehmen zu dem was ich sehe. Ich sehe da nichts von maximal 5-mal. Sondern dauerhaft. Wenn du etwas nur 5-mal mache willst, gibt’s dafür ja andere schleifen.

Re: Fehler: RuntimeWarning: coroutine 'main' was never awaited

Verfasst: Dienstag 23. August 2022, 07:58
von Sirius3
Dass `scanner` außerhalb des with-Blocks benutzt wird, sieht komisch aus. Aber das steht auch so in der Dokumentation (!).
Man benutzt keine einbuchstabigen Variablennamen. `d` ist ein `device`. Mit Deinem rekursiven Aufruf hast Du doch viel mehr Probleme, das sauber zu beenden. Wenn etwas 5mal durchlaufen werden soll, dann ist eine for-Schleife das richtige.

Code: Alles auswählen

import asyncio
from bleak import BleakScanner

async def main(): 
    scanner = BleakScanner() 
    for _ in range(5):
        async with scanner:
            await asyncio.sleep(10.0) 
        for device in scanner.discovered_devices: 
            print(device)

if __name__ == "__main__":
    asyncio.run(main())
Man ruft keine Skripte aus einem anderen Skript auf, sondern benutzt einfach Funktionen. Warum glaubst Du, das auf diese komplizierte Art lösen zu müssen?