こんにちはbeatbox4108です。
今回は少しPythonを書いていて躓いた点を覚書程度にまとめましたので見てみてください
TL;DR
io.BytesIO
を使おう。
seek(0)
するのを忘れずにしよう。
本文
Pythonで、Discordのスラッシュコマンドに反応して画像を送るbotを作っていた時のこと...
あれ?ファイルに出力しないと送信できなくね?
この時の環境、クラウド上で容量が結構少なかったのでどうしてもファイルに出力するのは避けたかったんです。
でもファイルオブジェクトかパスじゃないと送信できないし...
と、気づいたんです。そうかBytesIO
介せばいいのか!
ということで書いたこちらのコード、ダメな点が一つありました。
# im は PIL.Image.Image
fileio=BytesIO()
image.save(fileio,format="png")
await interaction.followup.send(file=discord.File(fileio,"file.png"))
あれ?
Discord側ではちゃんとファイルは送信されたものの、肝心の中身がありませんでした。
原因は簡単。ある1行が抜けていました。
fileio=BytesIO()
image.save(fileio,format="png")
+ fileio.seek(0)
await interaction.followup.send(file=discord.File(fileio,"file.png"))
これはIOの最初に戻るコマンド。
さっきのままだとどれだけ読み込んでもファイルの末端なので0バイトが出力されるだけでした。
筆者はこれに半日費やしました...
ってことでみんなは気を付けてくださいね...