Table of Contents
はじめに
Pythonのエラーは、コードではなく環境が原因であることがよくあります。特に「昨日まで動いていたのに」というときは、たいていライブラリのバージョンが噛み合っていません。
実際に遭遇したエラーと対処法をまとめました。
ライブラリのバージョン不整合
RequestsDependencyWarning
requests を使ったコードを実行すると出る警告です。
RequestsDependencyWarning: urllib3 (2.0.7) or chardet (None)/charset_normalizer (2.0.11) doesn't match a supported version!requests が想定しているバージョンと、実際に入っている urllib3 のバージョンが噛み合っていません。まとめて更新すれば解消します。
$ pip install -U urllib3 requestsAttributeError: object has no attribute ‘_validate_data’
imbalanced-learn で fit_resample() したときに出ました。
'RandomOverSampler' object has no attribute '_validate_data'imbalanced-learn が依存している scikit-learn のバージョンが古いことが原因でした。0.23.0以上に上げると解消します。
$ pip install -U scikit-learnAttributeError: module ‘lightgbm’ has no attribute ‘Dataset’
import lightgbm as lgb
lgb_train = lgb.Dataset(X_train, y_train)# AttributeError: module 'lightgbm' has no attribute 'Dataset'明示的にインポートすると動くことがあります。
from lightgbm import Dataset原因の切り分け方
バージョン起因を疑ったら、まず次の2つを確認します。
# 依存関係に矛盾がないか検査する$ pip check
# 実際に入っているバージョンを見る$ pip list | grep パッケージ名pip check は、依存関係が壊れている組み合わせを一覧で教えてくれます。原因を探す前にこれを打つと早いです。
mypyで Library stubs not installed と言われる
requests を使った簡単なコードでも、mypyがこう言ってきます。
import requests
res = requests.get("https://example.com/")print(res.text)Library stubs not installed for "requests"型情報(スタブ)のパッケージが別配布になっているためです。入れれば解消します。
$ pip install types-requestsPEP8のエラーを抑制する
lintの指摘を、意図的に無視したい場面はあります。
# 行単位で無視するimport os # NOQA
# ファイル全体で無視する# flake8: NOQA特定のルールだけを無視することもできます。
import os # noqa: F401おわりに
環境起因のエラーは、コードをいくら読んでも原因が見つかりません。「昨日は動いた」「他の人の環境では動く」という症状が出たら、まず pip check と pip list でバージョンを確認するのが近道です。
そもそもの予防としては、プロジェクトごとに仮想環境を分けて、requirements.txt でバージョンを固定しておくのが確実です。
