• 카테고리

    질문 & 답변
  • 세부 분야

    업무 자동화

  • 해결 여부

    미해결

asyncio.run() cannot be called from a running event loop 에러 질문 드립니다

24.03.02 20:31 작성 조회수 658

0

안녕하세요 선생님

강의 듣고 있는 이광희라고 합니다.

올려주신 강의로 텔레그램 자체 API를 써서 메세지 전송하기까진 했는데요

이미지를 전송하려고 보니 거의 모든 블로그, 유튜브 설명들이 파이썬 텔레그램봇으로 설명 하더라구요

근데 이 봇이 v20으로 바뀌면서 비동기 프로그래밍(?)이 된거 같습니다.

설명하고 있는 코드들이 다 과거 버전 코드들이네요. 그래서 위키에 직접 가서 코드를 보고 있는데요

 

import asyncio
import telegram


async def main():
    bot = telegram.Bot("TOKEN")
    async with bot:
        print(await bot.get_me())


if __name__ == '__main__':
    asyncio.run(main())

그냥 위키에 나오는 간단한 코드인데도

 

RuntimeError: asyncio.run() cannot be called from a running event loop

이런 에러가 계속 뜹니다.

async 부터 공부하려고 다른 유튜브를 찾아서

import asyncio

async def main():
    await asyncio.sleep(1)
    print('hello')

asyncio.run(main())

이런 간단한 코드를 입력해도

똑같은 오류가 뜨네요...

이벤트 메인 루프가 실행되고 있는 동안에 함수가 작동할수 없다 그런 내용인거 같은데

위키에 있는 그대로 따라해도 에러가 나니 비전공자 입장에서는 어떻게 해야 좋을지 모르겠네요.

 

경영학과 출신 직장인이 실무에서 쓰려고 파이썬을 배우고 있는데

물어볼곳이 여기밖에 없어 여쭤봅니다ㅠㅠ 좀 도와주세요

깃헙? 말고 국내 파이썬 qna있는 커뮤니티라도 알려주시면 가서 좀 물어보고 싶은데 그게 어디인지도 모르겠네요.

답변 3

·

답변을 작성해보세요.

0

올리신 asyncio 기본 코드는 문제가 없으니 실행 환경을 바꿔보세요.

아래는 기본 api만으로 이미지를 보내는 방법입니다.

# 텔레그램 봇 API URL
url = f'https://api.telegram.org/bot{TOKEN}/sendPhoto'

# 이미지 파일 열기
with open(PHOTO_PATH, 'rb') as photo:
    files = {'photo': photo}
    data = {'chat_id': CHAT_ID}
    # 이미지를 전송하는 POST 요청 보내기
    response = requests.post(url, files=files, data=data)
    # 응답 출력
    print(response.json())

제가 강의에 python-telegram-bot 라이브러리를 사용하지 않은 이유가 바로 asyncio 때문입니다.
python-telegram-bot 라이브러리를 제대로 사용하려면 asyncio까지 어느 정도는 배워야 하니까요.
이미 asyncio를 아는 사람이 텔레그램을 사용하기 위해 python-telegram-bot 라이브러리를 공부하는 것과 python-telegram-bot 라이브러리를 사용하기 위해 asyncio를 공부해야 하는건 큰 차이가 있습니다.
이미 asyncio까지 알고 있다는건 프로그래밍을 기초 이상은 공부한 사람일테니까요.
대부분의 파이썬 기초책에는 asyncio에 대한건 아예 나오지도 않습니다.

그리고,
저도 비전공자입니다. 게다가 커뮤니티 활동도 전혀 안 하고 누구에게도 프로그래밍 관련 질문을 아예 안 하기 때문에 어느 커뮤니티에 질문을 올리면 좋을지는 모르겠습니다.
물론, 관련 커뮤니티는 검색하면 많이 나오니까 한번 찾아 들어가 보셔도 좋을 것 같습니다.

감사합니다 선생님!!

이 코드도 인터넷에 나오는데가 없어서 몇시간 하다가 텔레그램봇으로 넘어 갔거든요

이걸로 해볼게요 감사합니다

0

https://stackoverflow.com/questions/56154176/runtimeerror-asyncio-run-cannot-be-called-from-a-running-event-loop-in-spyd

찾다가 여기까지 갔네요... 아나콘다 쓰는게 문제인거 같은데 그래도 또 새로운 에러가..

자문자답 합니다. 찾으시는 분들 있을까봐 남겨놓습니다.

0

프로그램은 아나콘다 스파이더 쓰고 있구요

 

챗gpt에 물어보니

 

당신 말이 맞아요. asyncio.run()기존 이벤트 루프 내에서는 호출할 수 없습니다. 이 제한은 예기치 않은 동작으로 이어질 수 있는 중첩된 이벤트 루프를 실수로 생성하는 것을 방지하기 위해 적용됩니다.

이미 이벤트 루프가 실행 중인 환경(예: Jupyter 노트북 또는 대화형 Python 셸)에서 이 코드를 실행하는 경우 이벤트 루프를 수동으로 만들고 실행해야 합니다.

이러한 환경에서 작동하도록 코드를 수정하는 방법은 다음과 같습니다.

import asyncio

async def main():
    await asyncio.sleep(1)
    print('hello')

# If there's an event loop running, get it
loop = asyncio.get_event_loop()

# Schedule the coroutine to run in the existing event loop
loop.run_until_complete(main())

그래도 에러가 뜹니다

RuntimeError: This event loop is already running