-
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 discordFile "/[lib_path]/site-packages/discord/__init__.py", line 20, in <module>from .client import Client, AppInfo, ChannelPermissionsFile "/[lib_path]/python3.7/site-packages/discord/client.py", line 38, in <module>from .state import ConnectionStateFile "/[lib_path]/python3.7/site-packages/discord/state.py", line 36, in <module>from . import utils, compatFile "/[lib_path]/python3.7/site-packages/discord/compat.py", line 32create_task = asyncio.async^SyntaxError: invalid syntax이 문제를 해결해도 다른 에러가 또 발생하고 그 에러의 해결 방법도 똑같기 때문에 일단은 모두 나열하자면Traceback (most recent call last):File "[filename].py", line 1, in <module>import discordFile "/[lib_path]/python3.7/site-packages/discord/__init__.py", line 20, in <module>from .client import Client, AppInfo, ChannelPermissionsFile "/[lib_path]/python3.7/site-packages/discord/client.py", line 42, in <module>from .voice_client import VoiceClientFile "/[lib_path]/python3.7/site-packages/discord/voice_client.py", line 43, in <module>import websocketsFile "/[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, WebSocketCommonProtocolFile "/[lib_path]/python3.7/site-packages/websockets/protocol.py", line 17, in <module>from .compatibility import asyncio_ensure_futureFile "/[lib_path]/python3.7/site-packages/websockets/compatibility.py", line 9asyncio_ensure_future = asyncio.async # Python < 3.5^SyntaxError: invalid syntax또 이 문제를 해결하면Traceback (most recent call last):File "[filename].py", line 1, in <module>import discordFile "/[lib_path]/python3.7/site-packages/discord/__init__.py", line 20, in <module>from .client import Client, AppInfo, ChannelPermissionsFile "/[lib_path]/python3.7/site-packages/discord/client.py", line 42, in <module>from .voice_client import VoiceClientFile "/[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 aiohttpFile "/[lib_path]/python3.7/site-packages/aiohttp/__init__.py", line 10, in <module>from .protocol import * # noqaFile "/[lib_path]/python3.7/site-packages/aiohttp/protocol.py", line 18, in <module>from .helpers import reifyFile "/[lib_path]/python3.7/site-packages/aiohttp/helpers.py", line 25ensure_future = asyncio.async^SyntaxError: invalid syntax원인
문제의 원인은 python 3.7에서 새롭게 추가 된 keyword와 연관이 있다.
What’s New In Python 3.7 | Changes in Python Behavior
위 링크를 타고 들어가면 아래 글을 볼 수 있다
async
andawait
names are now reserved keywords. Code using these names as identifiers will now raise aSyntaxError
. (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을 오픈소스로 공개하고 개발하고 있다. 혹시 이 글을 보는 분들 중 참고해서 도움이 되었으면 좋겠다.