Ожидание и асинхронность, сопрограммы никогда не ожидались

Итак, в основном я пытаюсь написать программу, которая может управлять светом волшебника через скрипт Python. Я использую python 3.6 из-за других ограничений. Вот ссылка на проект pywizlight, который я использую для подключения к wizlight.

https://pypi.org/project/pywizlight/

Я понимаю, что код говорит, что он будет работать только в python 3.7 и выше, однако мне интересно, можно ли заставить его работать в 3.6. Я знаю, что это может быть сложно проверить, если у вас нет волшебной лампы (возможно). При запуске я получаю следующее сообщение об ошибке:

RuntimeWarning: 
coroutine 'wizlight.turn_on' was never awaited`
  light.turn_on(PilotBuilder(brightness = 255))

А вот код:

import pywizlight
import asyncio
from pywizlight import wizlight, PilotBuilder, discovery

async def main():
    loop = asyncio.get_event_loop()
    task = loop.create_task(turn_off())
    await task

async def turn_off():
    light = wizlight("ip address of wiz bulb")
    light.turn_on(PilotBuilder(brightness = 255))

loop = asyncio.get_event_loop()
loop.run_until_complete(main())

Кто-нибудь может заставить его работать? У меня всего около 2 мозговиков, поэтому я не могу.


person kill me    schedule 15.02.2021    source источник


Ответы (2)


Вы пробовали добавить директиву await?

async def turn_off():
    light = wizlight("ip address of wiz bulb")
    await light.turn_on(PilotBuilder(brightness = 255))

РЕДАКТИРОВАТЬ: ответ на дополнительный вопрос в комментариях

Я не могу проверить это, поскольку у меня нет wizlight, но вы можете добиться успеха, создав только один цикл событий и используя его для выполнения задачи async из turn_off.

async def turn_off():
    light = wizlight("ip address of wiz bulb")
    await light.turn_on(PilotBuilder(brightness = 255))

loop = asyncio.get_event_loop()
loop.run_until_complete(turn_off())

Этот другой ответ SO более подробно объясняет использование цикла событий.

person SpaceKatt    schedule 25.02.2021
comment
Я попытался добавить директиву await, затем я получаю сообщение об ошибке, модуль asyncio не имеет атрибута create_task. Я считаю, что это потому, что я использую Python 3.6, но я не знаю. - person kill me; 25.02.2021
comment
@killme, я обновил свой ответ выше, чтобы исправить вашу ошибку добавления. Если это сработает для вас, отметьте ответ как принятый n_____n - person SpaceKatt; 25.02.2021

Хорошо, мне удалось выяснить, что происходит, и я оставляю этот вопрос здесь на случай, если кто-то еще попытается сделать то же самое с pywizlight в python 3.6. Моя проблема заключалась в том, что я продолжал получать множество ошибок, но в основном я сталкивался с проблемой, что я не мог создать задачу, потому что это python 3.6. Модуль создания задачи был реализован в Python 3.7. Способ исправить это был в самом пакете, в частности в файле python bulb.py. После изменения asyncio.create_task на asyncio.ensure_future в строках 210, 217, 295 и 306 запустите следующий код:

async def turn_off():
    light = wizlight("your wiz light ip address here")
    await light.turn_on(PilotBuilder(brightness = 255))
    await light.turn_off()
    await light.turn_on(PilotBuilder(rgb = (0, 128, 255)))
    await light.turn_off()

loop = asyncio.get_event_loop()
loop.run_until_complete(turn_off())

Свет включился, выключился, включился снова, но уже в цвете, а затем погас. Я надеюсь, что это поможет людям, которые пытаются добиться того же, что и я.

person kill me    schedule 26.02.2021