SakuraProject / sakura-bot

SakuraBotです。
MIT License
9 stars 3 forks source link

PyQRcodeのせいでpipenv installができない #98

Closed kousakirai closed 1 year ago

kousakirai commented 1 year ago

pipfile.lockでビルド時に失敗するっぽい。多分こいつが古いせいで3.10.8で使えない説がある

kousakirai commented 1 year ago

https://github.com/lincolnloop/python-qrcode こっちのライブラリは最近も更新されてるみたいだからこっちに乗り換えたほうが良いのではと個人的に思ってる

kousakirai commented 1 year ago

と言うか乗り換え作業しますわ。ついでにqrの実装部分も更新する

yaakiyu commented 1 year ago

あー なるほど ありがとう

kousakirai commented 1 year ago

途中経過報告:python-qrcodeで出力されたPILImageをbytesに変換すると何故か中身が消える。原因知ってるやついたら教えてクレメンス

ysmreg commented 1 year ago

import io を追加して

qrbyte = io.BytesIO()
pilimage.save(qrbyte, format='PNG')
qrbyte = qrbyte.getvalue()

みたいにすればできるかもです

kousakirai commented 1 year ago

すでに試してたんだけど駄目だったんだよなぁ... なんかsave関数を通すと駄目っぽい

yaakiyu commented 1 year ago

save関数通さずに直接sendに画像データ渡せば?

kousakirai commented 1 year ago

多分無理だと思われるぞ。discord.File関数通してやろうとしてみたけどPILImageからbytesへの変換が必須だった。

yaakiyu commented 1 year ago

色々ソースコード見てきた。PILImageってクラス、独自実装だったのね...

import io, qrcode

qr = qrcode.make("...")
qrbyte = io.BytesIO()
qr._img.save(qrbyte, format='PNG')  # _img属性にpil.Image.Imageクラスが入ってる
kousakirai commented 1 year ago

独自実装ちゃうで。PILの中にあるやつやで

yaakiyu commented 1 year ago

e

Or in Python, use the make shortcut function:

import qrcode
img = qrcode.make('Some data here')
type(img)  # qrcode.image.pil.PilImage
img.save("some_file.png")

気のせいか...?

kousakirai commented 1 year ago

すまん違うわ独自実装だ

yaakiyu commented 1 year ago

でも見る限り独自実装のsave関数でも問題はなさそうなんだよな...

kousakirai commented 1 year ago

何故かsaveすると中身が消滅する。俺の環境だけかもしれんから一回yaakiyuの手元の環境で試せそうなら試してみてほしい

yaakiyu commented 1 year ago

ちゃんと生成されたよー

kousakirai commented 1 year ago

メモリ上に書き出せる?BytesIOで。

tasuren commented 1 year ago

自分できたよ。

kousakirai commented 1 year ago

じゃあおま環かぁ...

tasuren commented 1 year ago

いや、まだわからん。どういうコードか見てないから。

yaakiyu commented 1 year ago

ってかたまにtasurenがひょこっと出てくるの面白い

kousakirai commented 1 year ago
@qr.command(description="QRコードをテキストから生成します")
async def make(self, ctx: commands.Context, text: str):
    stream = BytesIO()
    img = qrcode.make(text)
    img.save(stream, "PNG")
    stream.seek(0)
    byte_img = stream.getvalue()
    print(type(byte_img))
    stream.close()
    file = discord.File(fp=byte_img)
    await ctx.reply(file=file)

ワイのローカルで動かしてるやつ

tasuren commented 1 year ago

本当に空になるの?

yaakiyu commented 1 year ago

discord.Fileに渡すのにgetvalueをする必要なくね? bytesに変換しちゃうと相対パスとして認識されるはず。

kousakirai commented 1 year ago

本当に空になるの?

b''が返ってくるから空なのはホント

discord.Fileに渡すのにgetvalueをする必要なくね? bytesに変換しちゃうと相対パスとして認識されるはず。

そういやそうじゃん

tasuren commented 1 year ago

print(byte_img)ってやれば何かしら表示されるはず。

kousakirai commented 1 year ago

それで返ってきたのがb''

tasuren commented 1 year ago

うぇ 自分のTermuxでやったらできたんだけどね。

kousakirai commented 1 year ago

俺もコンソール上でやる分には普通に行けるんよ。でもPythonでいざ動かそうとしたらダメになる subprocess通してやるかなぁ...

kousakirai commented 1 year ago

画像生成自体はうまく行ってるけどそれをいざBytesIOに渡そうとすると事故るな。

kousakirai commented 1 year ago

仮説やけどさぁ...これBytesIOを使ってるから駄目とかそういうオチ?

kousakirai commented 1 year ago

seek忘れじゃねぇかこんちくしょう

yaakiyu commented 1 year ago

修正済み。