WSLで requirements.txt が反映されない原因と解決方法(pip install -r が効かない)

WSLで requirements.txt が反映されない原因と解決方法(pip install -r が効かない)

① 結論

WSLで pip install -r requirements.txt を実行したのに、ライブラリが入っていない/importできない場合、
原因の多くは 「実行しているPythonとpipの紐づけがズレている」「venvが有効化されていない」 です。
まず python -m pip を使ってインストール先を統一し、which pythonecho $VIRTUAL_ENV で環境が揃っていることを確認してください。

結論だけ先に手順を書くと、以下で直るケースが最も多いです。

# プロジェクト直下で
source venv/bin/activate
python -m pip install -U pip
python -m pip install -r requirements.txt

② 症状

  • pip install -r requirements.txt はエラーなく成功する
  • しかし実行すると ModuleNotFoundError が出る
  • pip freeze を見ると入っているはずなのに、実行環境では見えない
  • WSLのターミナルでは動くが、VS Code実行(Run/Debug)だけ失敗する

③ 原因(原因+詳細)

原因1:pip と python の紐づけがズレていて、別環境にインストールされている

【詳細】

  • なぜ起きるか
    WSLには python / python3 が混在していたり、venvの有無で参照先が変わります。
    その状態で pip install -r を実行すると、「今実行しているPythonとは別のPython環境」に入ってしまうことがあります。
    すると requirements.txt 自体は“入った”ように見えますが、実行時に import できず「反映されない」ように見えます。
  • 起きやすい条件
    pip を素で使っている/Pythonが複数入っている/--user を付けたことがある/venvを切り替えている
  • 判断ポイント(コマンド or 状態)
    pip がどのPythonに紐づいているかを確認します。
which python
python -c "import sys; print(sys.executable)"

pip --version
python -m pip --version

正常の目安pip --versionpython -m pip --version が同じ系統のパス(できれば .../venv/)を指すこと。
ここがズレているなら、requirements.txt は“別の場所”に入っています。


原因2:venvが有効化されていない(または別ディレクトリ/別シェルで有効化できていない)

【詳細】

  • なぜ起きるか
    venvは作成しただけでは有効にならず、source venv/bin/activate が必要です。
    有効化していない状態で pip install -r をすると、グローバル環境に入ったり、別venvに入ります。
    さらに、プロジェクト直下ではない場所でactivateしようとして失敗しているケースも多いです。
  • 起きやすい条件
    ターミナルを複数開いている/cdせずにコマンド実行/WSLを再起動した/fish等のシェルを使っている
  • 判断ポイント(コマンド or 状態)
pwd
ls -la
echo $VIRTUAL_ENV
which python

$VIRTUAL_ENV が空、または which python/usr/bin/python3 のままなら venv は有効化されていません。

venv周りの基本切り分けは、以下の記事で手順を詳しくまとめています(先に揃えると最短です)。


原因3:requirements.txt の内容/実行場所が想定とズレている

【詳細】

  • なぜ起きるか
    pip install -r requirements.txt は「カレントディレクトリ」にある requirements.txt を読みます。
    そのため、別ディレクトリで実行していると “別のrequirements.txt” を読んだり、空のファイルを読んで「何も入らない」状態になります。
    また、requirements.txt に誤ったパッケージ名、Pythonバージョン不一致の指定、環境依存の指定があると、成功しているように見えて一部だけ入っていないことがあります(ログが流れて見逃しやすい)。
  • 起きやすい条件
    プロジェクト直下が複数ある/monorepo/requirements.txtを分割している/相対パスで混乱している
  • 判断ポイント(コマンド or 状態)
# どのrequirements.txtを読んでいるか確認
pwd
ls -la requirements.txt

# 中身の確認(行数と先頭だけ見る)
wc -l requirements.txt
head -n 30 requirements.txt

さらに「本当に入ったか」を確実にするなら、インストール後に以下で確認します。

python -m pip freeze | head -n 50
python -c "import pkgutil; print('requests' in [m.name for m in pkgutil.iter_modules()])"

④ 切り分け手順(コマンド付き)

  1. プロジェクト直下か確認
pwd
ls -la
  1. venv有効化の状態を確認
echo $VIRTUAL_ENV
which python
python -c "import sys; print(sys.executable)"
  1. pipの紐づけを確認(最重要)
pip --version
python -m pip --version
  1. requirements.txt を正しく読めているか確認
ls -la requirements.txt
head -n 30 requirements.txt
  1. インストール後に「実行Pythonで」入ったか確認
python -m pip freeze | head -n 50

⑤ 解決方法

解決1:venvを有効化し、python -m pip でインストールする(最優先)

cd /path/to/project
source venv/bin/activate

python -m pip install -U pip
python -m pip install -r requirements.txt

これで「実行するPython」と「requirements.txtのインストール先」を確実に一致させられます。

解決2:混乱している場合はvenvを作り直す(確実)

# venvが有効なら解除
deactivate 2>/dev/null || true

rm -rf venv
python3 -m venv venv
source venv/bin/activate

python -m pip install -U pip
python -m pip install -r requirements.txt

解決3:requirements.txt の指定を見直す(内容ズレ対策)

以下が含まれている場合、環境差で失敗・一部未導入になりやすいです。

  • パッケージ名のタイプミス(例:大文字小文字や別名)
  • 極端に古い固定バージョン(例:package==0.0.1
  • OS依存のパッケージ(ビルドが必要)

まずは最小で再現させ、ログを明示して確認します。

python -m pip install -r requirements.txt -v

⑥ 再発防止

  • pipは必ず python -m pip を使う(紐づけズレ防止)
  • プロジェクト開始時に echo $VIRTUAL_ENV / which python を確認する
  • セットアップ手順をREADMEに固定し、毎回同じ順序で作業する
  • requirements.txt はプロジェクト直下に置き、分割するなら命名規則(例:requirements-dev.txt)を統一する

⑦ それでもダメな場合

requirements.txt を入れたのに import できない場合、最終的には ModuleNotFoundError として表面化します。
その場合は「どのPythonで実行しているか」「pipがどこへ入れているか」のズレが原因のことが多いです。
以下の記事で、ズレの典型パターンと直し方を切り分けています。

上記でも解決しない場合は、以下の出力をそのまま貼ると原因を特定しやすいです。

pwd
echo $VIRTUAL_ENV
which python
python -c "import sys; print(sys.executable)"
pip --version
python -m pip --version
head -n 30 requirements.txt

コメント

タイトルとURLをコピーしました