0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

WindowsでTwineを使うと日本語があるだけでエラーが出る話と、直した話

0
Posted at

この記事は 「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"を言語化していきます。

👉 ストックをフォローしておくと次の記事を見逃しません!

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?