Fehler: RuntimeWarning: coroutine 'main' was never awaited

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
bachatero18
User
Beiträge: 43
Registriert: Montag 12. August 2019, 13:57

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]
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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?
bachatero18
User
Beiträge: 43
Registriert: Montag 12. August 2019, 13:57

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?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
Sirius3
User
Beiträge: 18265
Registriert: Sonntag 21. Oktober 2012, 17:20

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?
Antworten