python-qrcodeとは

Pythonでqrcodeを扱うための外部パッケージに「qrcode」がある。

  • インストール方法 $ pip3 install qrcode

で、installすると、qrコマンドが使えるようになる。次のように使うと、コマンドラインからQRコードを生成できて便利。

$ qr "http://kamatari.github.io" > blog_url.png

生成されたqrcode

発生する問題

ただ、次のようなエラーがPython3系で発生する。メッセージを見ると、2系から3系になったときにstring型とbyte型を区別して扱うようになった影響のエラーっぽいことが分かる。

Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.5/bin/qr", line 9, in <module>
    load_entry_point('qrcode==5.1', 'console_scripts', 'qr')()
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/qrcode/console_scripts.py", line 60, in main
    img.save(sys.stdout)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/qrcode/image/pil.py", line 32, in save
    self._img.save(stream, kind)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/PIL/Image.py", line 1665, in save
    save_handler(self, fp, filename)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/PIL/PngImagePlugin.py", line 690, in _save
    fp.write(_MAGIC)
TypeError: write() argument must be str, not bytes

解決方法

qrcodeのconsole_scrripts.pyimg.saveの部分を直せばよさそうだ。しかし、githubにある本家のコードを見に行った所、すでに修正されていた。pypiにリリースされるまでは、下のcommitを参考に自分の環境のファイルを修正するか、githubから落としてきたコードを使おう。(修正する場合、自分の環境のファイルがどこにあるかは、表示されているエラーの内容を確認のこと)