この記事は 「Pythonって、たぶんそういう意味じゃない」シリーズ の番外編です。
Python歴5年以上、メインで使い続けてきた変態が書いています。
Pythonのパッケージを公開しようとして、Twineを使った。
日本語が含まれているだけで、エラーが出た。
調べて、原因を特定して、PRを出したら通った。
でもまだ正式リリースには来ていない。そんな話を書く。
何が起きていたのか
Windowsの環境でTwineを使い、設定ファイルに日本語が含まれていると
以下のようなエラーが発生する。
UnicodeDecodeError: 'cp932' codec can't decode byte...
原因はシンプルだ。
WindowsのデフォルトエンコードはUTF-8ではなくcp932(Shift-JIS系)。
TwineがファイルをOS任せのエンコードで読み込もうとするため、
UTF-8で書かれた日本語を含むファイルが読めずに落ちる。
「日本語があるだけでエラー」という問題は、Windowsユーザー限定で最新版まで続いている。
どこが問題だったのか
twine/utils.pyの中で、設定ファイルを読み込む際に
encodingを明示していなかった。
Pythonのopen()はencodingを省略すると
OSのデフォルトエンコードを使う。
Windowsではcp932が使われるため、UTF-8のファイルが読めない。
修正内容
utils.pyの_parse_file関数で、まずシステムのエンコードで試み、
失敗したらUTF-8でリトライする実装に修正した。
# 修正のイメージ
try:
# まずシステムデフォルトで試みる
parser.read(path)
except UnicodeDecodeError:
# 失敗したらUTF-8で再試行
parser.read(path, encoding="utf-8")
全テスト231件パス、カバレッジ97%でマージされた。
現状:マージ済み、でも未リリース
修正はマージされたが、まだ正式リリースには含まれていない。
つまりpip install twineで入る最新版では、この問題がまだ残っている。
今すぐ直したい人への回避策
① 日本語を使わない
設定ファイルのコメントやフォルダ名を半角英数のみにする。
手っ取り早いが、根本解決ではない。
② GitHubから直接インストールする
pip install git+https://github.com/pypa/twine.git
修正済みのコードが入るので、正式リリース前でも使える。
GitHubから直接入れるのは開発版なので、自己責任で。
まとめ
- 原因 → WindowsのデフォルトエンコードがUTF-8ではない
-
修正 →
encoding="utf-8"のフォールバック処理を追加 - 現状 → マージ済み、正式リリース待ち
- 回避策 → 日本語を避けるか、GitHubから直接インストール
正式リリースが来たら追記予定です。
(忘れてたらごめんなさい)
「Pythonって、たぶんそういう意味じゃない」 シリーズでは、
こういう"なんとなくで語られがちなPython"を言語化していきます。
👉 ストックをフォローしておくと次の記事を見逃しません!