Edited at
DiscordDay 6

discordpyを仮想環境(pipenv)で使う

※ 2019/04/09のrewrite版正式リリースに伴い内容を修正しました。


はじめに

discord.py と discord bot の基本的なことに関してはこちらをお読みください。

Pythonで実用Discord bot(discord.py解説) - Qiita

discord.py は 2019/04/09 に v1.0.0(rewrite) が正式にリリースされましたが、

旧版の v0.16.12(async) を利用している方も多いかと思われます。

v1の方が設計もスッキリして機能も充実しているためアップデートを行うべきですが、

APIに多くの破壊的変更が行われたため、

移行までは両環境を併用せざるをえないかと思います。

そこで、pythonおよびdiscord.pyのバージョンを自由に切り替えることができる

仮想環境を利用しましょう。

本記事ではその方法を解説します。


動作環境


  • Python 3.7.3

  • pip 19.0.3

  • pipenv 2018.11.26

  • discord.py 1.0.1


Pipenv のインストール

Pipenv: 人間のためのPython開発ワークフロー — pipenv ドキュメント

こちらはグローバル環境にインストールします。


pipenvのインストール

python3 -m pip install -U pipenv



pipenvのインストール(簡略コマンド)

pip3 install pipenv


3 の部分は必要であれば適宜 3.7 などに置き換えてください。

また、homebrewでもインストールが可能です。


homebrewでのpipenvのインストール

brew install pipenv



仮想環境の作成

こちらは仮想環境を利用したいディレクトリ内で行います。

(仮想環境はディレクトリ単位で利用します)

まずはディレクトリ直下で以下のコマンドを打って仮想環境を作成しましょう。

もし requirements.txt があれば、ライブラリのインストールも合わせて行われます。


仮想環境の作成

pipenv install


仮想環境を作成すると、ライブラリやバージョン情報などが記述された

Pipfile Pipfile.lock という2つのファイルが作成されます。

これらのファイルに関して中身などを気にする必要はあまり生じることはありません。

必要であれば利用するpythonのバージョンも指定しましょう。


pythonのバージョン指定

pipenv --python 3.7.3


実は以下に示す仮想環境へのライブラリのインストールを行うことで、

仮想環境の作成も合わせて行うことができるので、

特に必要がなければこれらの初期設定は不要です。


discord.py を仮想環境にインストール

仮想環境を利用するディレクトリ直下で行ってください。


discord.pyのインストール

pipenv install discord.py


仮想環境でインストールされているライブラリは以下で確認することができます。


仮想環境のライブラリの確認

pipenv graph



pipenv_graphの例

$ pipenv graph

discord.py==1.0.1
- aiohttp [required: >=3.3.0,<3.6.0, installed: 3.5.4]
- async-timeout [required: >=3.0,<4.0, installed: 3.0.1]
- attrs [required: >=17.3.0, installed: 19.1.0]
- chardet [required: >=2.0,<4.0, installed: 3.0.4]
- multidict [required: >=4.0,<5.0, installed: 4.5.2]
- yarl [required: >=1.0,<2.0, installed: 1.3.0]
- idna [required: >=2.0, installed: 2.8]
- multidict [required: >=4.0, installed: 4.5.2]
- websockets [required: >=6.0,<7.0, installed: 6.0]


botの作成と起動

以下は 公式のサンプルコード を少し拡張したものです。

環境変数を追加するかコードを変更するかのどちらかが必要です。


discordbot.py

import traceback

import discord
import os

client = discord.Client()

# 環境変数からBOTのTOKENと自分のユーザIDを取得
TOKEN = os.environ['DISCORD_BOT_TOKEN']
DEVELOPER_ID = int(os.environ['DISCORD_DEVELOPER_ID'])

async def send2developer(text):
""" 開発者にDMを送る """
developer = client.get_user(DEVELOPER_ID)
dm = await developer.create_dm()
await dm.send(text)

@client.event
async def on_ready():
""" 起動時のイベントハンドラ """
text = f'Logged on as {client.user}!'
await send2developer(text)

@client.event
async def on_message(message):
""" メッセージ受信時のイベントハンドラ """
try:
if message.author != client.user: # bot自身の発言には反応しない
text = 'Message from {0.author}: {0.content}'.format(message)
await send2developer(text)
except Exception: # エラー発生時にはトレースバックがDMで送られてくる
await send2developer(traceback.format_exc())

client.run(TOKEN)


作成した仮想環境(Pipenv)にて上記のプログラムを以下のように実行します、


botの起動

pipenv run python discordbot.py


ログイン情報がDMで送られてきたら無事成功です。


関連リンク