AttributeError: ‘Bot’ object has no attribute ‘servers’ と言われた(Discord Bot)

現在、自分がBotの管理をしているDiscordサーバーには、MusicBotとTTS Bot(zyandoさんが作ってくれたやつ)が同居していて、これをConohaのVPS上で動かしてます。

どちらもPythonで動かしているのですが、いきなり「AttributeError: ‘Bot’ object has no attribute ‘servers’ 」と出てきてTTS Botくんが死亡しました。

結論から言えば、原因はdiscord.pyの”rewrite version”でした。

2種類存在する「discord.py」

discordのBotをPythonで簡単に書けるようにした「discord.py」には、従来からのバージョンである”0.16.12″と、”rewrite version”とも呼ばれる”1.0.0a”というものが存在しているようです(2018年9月現在)。いろいろシンプルになってるらしい。

以下が、rewrite versionのドキュメントです。

Migrating to v1.0 ー discord.py 1.0.0a documentation

実際の文法の違いはこんな感じ。これだけで、全く異なる構造であることがわかります。rewrite って言うくらいだからね。

# before
await client.send_message(channel, 'Hello')

# after
await channel.send('Hello')

今回は、このrewrite versionと従来のバージョンの競合によって、Attribute Errorが発生したようでした。

うちのサーバーにrewrite versionがインストールされた経緯

rewrite versionのdiscord.pyの存在を知らなかったのに、どうしてサーバーにインストールされてしまったのか。原因は、問題発生前日に行ったMusicBotのアップデート。

Changelog | MusicBot

上記のChangelogを見ると、最新バージョンのところにdiscord.py rewriteと、しっかり書いてありました。アップデートを走らせると requirementは自動でインストールされます。そして、MusicBotくんはrewrite versionを要求します。

要は、discord.pyのバージョンが0.16.12->1.0.0aに”上書きアップデート”されてしまったわけです。

結果として、”import discord”した際に、rewrite version が読み込まれるようになり、0.16向けに書かれたTTS Botが動作できなくなった、というのが今回起こったことでした。

解決策

これが正攻法ではないと思いますが(というか他の環境でもうまくいくかわからない)、どちらも名前が”discord.py”なので、別バージョンのPythonで動作させることで解決しました。

“python3.x -m pip list”でインストールされているモジュールの名前とバージョンのリストを参照できます。

Python3.5 -> discord.py   0.16.12
Python3.6 -> discord.py   1.0.0a

のようになっていればOKです。TTS BotはPython3.5、MusicBotはPython3.6で動作するように起動スクリプトを書き換えました。

最後に、それぞれのBotが動作することを確認して終了。

 

 

かず猫

インターネット初心者です。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

コメントする

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください