본문 바로가기

프로그래밍/Python

pyupbit WebSocketClient 예제코드를 실행할 때, TypeError: 'async for' requires an object with __aiter__ method, got Connect

반응형

pyupbit 의 WebSocketClient 예제를 한번 실행해 보았다. 예제는 https://wikidocs.net/168437 에 있는 가장 간단한 예제이다.

import multiprocessing as mp
import pyupbit


if __name__ == "__main__":
    queue = mp.Queue()
    proc = mp.Process(
        target=pyupbit.WebSocketClient,
        args=('ticker', ["KRW-BTC"], queue),
        daemon=True
    )
    proc.start()

    while True:
        data = queue.get()
        print(data)

 

실행해 보았는데, 에러가 발생하였다. 에러는 다음과 같다.

   self._target(*self._args, **self._kwargs)
  File "C:\PyEnvs\v3864\lib\site-packages\pyupbit\websocket_api.py", line 12, in __init__
    self.run()
  File "C:\PyEnvs\v3864\lib\site-packages\pyupbit\websocket_api.py", line 36, in run
    asyncio.run(self.connect_socket())
  File "C:\Programs\Python3864\lib\asyncio\runners.py", line 43, in run
    return loop.run_until_complete(main)
  File "C:\Programs\Python3864\lib\asyncio\base_events.py", line 616, in run_until_complete
    return future.result()
  File "C:\PyEnvs\v3864\lib\site-packages\pyupbit\websocket_api.py", line 16, in connect_socket
    async for websocket in websockets.connect(uri, ping_interval=60):
TypeError: 'async for' requires an object with __aiter__ method, got Connect

사용자 코드가 아닌, pyupbit 라이브러리 코드 안에서 에러가 발생했다. 

에러를 해석하 보면, async for 는 __aiter__ 가 필요한데, __aiter__ 가 아닌 Connect 라는 불평이다. 이에 해당하는 코드는 async for websocket in websockets.connect(uri, ping_interval=60): 이다. ( aiter 는 async iter 겠지. )

유추해 보자면, websockets.connect(uri, ping_intervals=60) 이 __aiter__ 여야 하는데, Connect 객체라는 말이다. 대체 문제가 뭔지 모르겠어서 고생고생 이것저것 해보다가, websockets.connect 는 websockets 패키지의 일부라는 생각이 들어서, websockets 패키지를 업데이트 해 보았다.

pip install -U websockets

websockets 는 9.1에서 10.3 으로 업데이트가 일어났고, 업데이트 이후에는 에러가 없이 잘 동작하였다. async 랑 안 친해서, 쫄았는데, 다행히 간단히 해결됐다.

websockets 의 10 버전으로 올라가면서, 아마도 connect 가 __aiter__ 로 바뀐 것 같다. 

728x90