ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • discord.py를 이용해서 discord bot을 만들면서 발생하는 문제들
    Python 2019. 2. 7. 17:28

    Python 3.7 호환성

    문제점

    작성일 (2019.02.07) 현재까지 python 3.7에 대한 호환문제가 있다. 아래 세 package에서 발생하는 문제다.

    • discord (discord.py)
    • websockets
    • aiohttp

    discord.py를 설치하고 봇을 실행하면 아래와 같은 에러가 발생한다.

    Traceback (most recent call last):
      File "[filename].py", line 1, in <module>
        import discord
      File "/[lib_path]/site-packages/discord/__init__.py", line 20, in <module>
        from .client import Client, AppInfo, ChannelPermissions
      File "/[lib_path]/python3.7/site-packages/discord/client.py", line 38, in <module>
        from .state import ConnectionState
      File "/[lib_path]/python3.7/site-packages/discord/state.py", line 36, in <module>
        from . import utils, compat
      File "/[lib_path]/python3.7/site-packages/discord/compat.py", line 32
        create_task = asyncio.async
                                  ^
    SyntaxError: invalid syntax

    이 문제를 해결해도 다른 에러가 또 발생하고 그 에러의 해결 방법도 똑같기 때문에 일단은 모두 나열하자면

    Traceback (most recent call last):
      File "[filename].py", line 1, in <module>
        import discord
      File "/[lib_path]/python3.7/site-packages/discord/__init__.py", line 20, in <module>
        from .client import Client, AppInfo, ChannelPermissions
      File "/[lib_path]/python3.7/site-packages/discord/client.py", line 42, in <module>
        from .voice_client import VoiceClient
      File "/[lib_path]/python3.7/site-packages/discord/voice_client.py", line 43, in <module>
        import websockets
      File "/[lib_path]/python3.7/site-packages/websockets/__init__.py", line 3, in <module>
        from .client import *
      File "/[lib_path]/python3.7/site-packages/websockets/client.py", line 12, in <module>
        from .protocol import CONNECTING, OPEN, WebSocketCommonProtocol
      File "/[lib_path]/python3.7/site-packages/websockets/protocol.py", line 17, in <module>
        from .compatibility import asyncio_ensure_future
      File "/[lib_path]/python3.7/site-packages/websockets/compatibility.py", line 9
        asyncio_ensure_future = asyncio.async           # Python < 3.5
                                            ^
    SyntaxError: invalid syntax

    또 이 문제를 해결하면

    Traceback (most recent call last):
      File "[filename].py", line 1, in <module>
        import discord
      File "/[lib_path]/python3.7/site-packages/discord/__init__.py", line 20, in <module>
        from .client import Client, AppInfo, ChannelPermissions
      File "/[lib_path]/python3.7/site-packages/discord/client.py", line 42, in <module>
        from .voice_client import VoiceClient
      File "/[lib_path]/python3.7/site-packages/discord/voice_client.py", line 65, in <module>
        from .gateway import *
      File "/[lib_path]/python3.7/site-packages/discord/gateway.py", line 31, in <module>
        import aiohttp
      File "/[lib_path]/python3.7/site-packages/aiohttp/__init__.py", line 10, in <module>
        from .protocol import *  # noqa
      File "/[lib_path]/python3.7/site-packages/aiohttp/protocol.py", line 18, in <module>
        from .helpers import reify
      File "/[lib_path]/python3.7/site-packages/aiohttp/helpers.py", line 25
        ensure_future = asyncio.async
                                    ^
    SyntaxError: invalid syntax

    원인

    문제의 원인은 python 3.7에서 새롭게 추가 된 keyword와 연관이 있다.

    What’s New In Python 3.7 | Changes in Python Behavior


    위 링크를 타고 들어가면 아래 글을 볼 수 있다


    async and await names are now reserved keywords. Code using these names as identifiers will now raise a SyntaxError. (Contributed by Jelle Zijlstra in bpo-30406.)


    해결 방법

    에러가 난 경로를 따라 들어가서 해당 파일을 수정해주면 된다.

    모두 아래와 같은 꼴인데


    try:

        create_task = asyncio.ensure_future

    except AttributeError:

        create_task = asyncio.async


    이제는 async가 keyword로 지정 되었으므로 해당 속성은 사용할 수 없다. 아래와 같이 수정하면 된다


    try:

        create_task = asyncio.ensure_future

    except AttributeError:

        create_task = getattr(asyncio, 'async')


    여담으로, 세 패키지에 대해서 3.7 호환성 문제로 오픈소스 기여 날로 먹기 위해 repo를 들어가봤지만, 이상하게도 모두 반영은 되어있었다. 다만 pypi에 반영되어있지 않았을 뿐..



    macOS에서 SSL 인증서 검증 실패

    이건 discord.py에만 한정되지 않는다, OS 또는 native python에서 문제가 발생한 것이기 때문에 근본적으로 discord.py에 문제가 있는것이 아니다. 다만, 봇을 개발하면서 마주칠 수 있는 문제라서 넣었다


    문제점

    python 3.7 이하 버전을 사용하거나 위 문제를 해결했는데 에러가 난다. 내용은 아래와 같다


    Unclosed client session

    client_session: <aiohttp.client.ClientSession object at 0x[object_addr]>


    이것도 taceback log를 보면 discord package에서 호출한 내용이기 때문에 내 코드가 잘못됐나? 하고 구글링을 하고 stackoverflow와 공식 repo issue를 뒤져보지만 문제를 해결할 수 없다.


    해결 방법

    파이썬이 설치된 경로 (예를 들어 3.7 버전은 /Applications/Python 3.7/)로 들어가 보면


    위와 같은 파일들이 있는데 여기서 "Install Certificates.command"를 실행하면 된다. 이후 다시 프로그램을 실행하면 제대로 동작한다.

    아니면 verification 기능을 끌 수도 있기는 한데 특별한 경우가 아니면 추천하지 않는다.



    마지막으로, 지금 개발중인 r6s discord bot을 오픈소스로 공개하고 개발하고 있다. 혹시 이 글을 보는 분들 중 참고해서 도움이 되었으면 좋겠다.

    댓글

Designed by Tistory.