【Python】実行中のPythonとインストール先の食い違いを診断する

PythonのTopに戻る


インストールしたのに別の実行画面ではimportできないときは、実行側のPythonと、pipを動かしたPythonを対応させる。確認の出発点は、失敗するプログラム自身が返すsys.executableである。ターミナルでpythonの版だけを見ても、同じ版のPythonが複数ある場合には区別できない。ここでは場所を比較し、同じ実行ファイルでpipを呼ぶところまで整理する。

失敗する場所で情報を出す

下のdiagnose.pyを、エディターの実行ボタンやノートブックなど、実際に失敗する環境で実行する。targetには調べたいimport名を指定する。練習例のtip_demoはローカルに作ったパッケージで、一般公開された配布物をインストールする指示ではない。

executableは起動中のPythonのパス、prefixは現在の環境の基準ディレクトリ、base_prefixは元のPythonの基準ディレクトリである。通常のvenvならprefixとbase_prefixが異なる。VIRTUAL_ENVという環境変数だけでは、現在のPythonを確定できない。

diagnose.py

import importlib.util
import json
import subprocess
import sys

target = "tip_demo"
if not sys.executable:
    raise RuntimeError("Python executable could not be identified")
result = subprocess.run(
    [sys.executable, "-m", "pip", "--version"],
    capture_output=True, text=True, check=False,
)
spec = importlib.util.find_spec(target)
print(json.dumps({
    "executable": sys.executable,
    "prefix": sys.prefix,
    "base_prefix": sys.base_prefix,
    "in_venv": sys.prefix != sys.base_prefix,
    "pip_returncode": result.returncode,
    "pip": result.stdout.strip(),
    "pip_error": result.stderr.strip(),
    "module_origin": None if spec is None else spec.origin,
}, indent=2))

pipはsys.executableを先頭にした引数リストから呼び出している。これならPATH上に偶然見つかった別のpipを使うことを避けられる。pip自体が入っていなければ、終了コードとstderrも確認する。sys.executableが取得できない特殊な実行環境もあるため、空の場合は明示的に停止させている。

二つの環境で違いを確かめる

動作確認では、一時ディレクトリに独立したvenv A・Bを作り、練習用tip-demoをAだけへインストールした。同じdiagnose.pyをそれぞれのPythonで実行すると、次のように違いが出る。ここでは実機ごとに変わるパスを掲載せず、比較結果を表示している。

実行結果

Environment A: in_venv=True, module_found=True
Environment B: in_venv=True, module_found=False
Different executables: True

Pythonのバージョンが同じでも、Aへ入れたパッケージはBから見えない。診断画面ではexecutableの先頭部分、pipの表示する配置先、module_originの三つを照合する。pipの版番号だけが一致していることを、同じ環境だと判断する根拠にしないようにしたい。

実行ファイルを指定して修正する

使う環境を決めたら、その環境のPythonから-m pipを実行する。次のコマンドはOSごとの書式例であり、パッケージ名は公式文書で確認した配布名へ置き換える。手元のvenvへパッケージを追加する操作なので、先に作業対象を確かめる。

コマンド例:Linux/macOSとWindows PowerShell(Windows/macOS未実行)

# Linux/macOS:.venvを使う場合の書式
.venv/bin/python -m pip --version
.venv/bin/python -m pip show DISTRIBUTION_NAME
.venv/bin/python -m pip install DISTRIBUTION_NAME

# Windows PowerShell:.venvを使う場合の書式
& ".\.venv\Scripts\python.exe" -m pip --version
& ".\.venv\Scripts\python.exe" -m pip show DISTRIBUTION_NAME
& ".\.venv\Scripts\python.exe" -m pip install DISTRIBUTION_NAME

WindowsではScripts、Linux/macOSではbinという配置が一般的である。パスに空白があれば適切に引用する。PowerShellでは引用した実行ファイルを呼ぶときに&を使う。activateはPATHを便利に切り替える仕組みであり、実行ファイルを明示して呼ぶ場合は必須ではない。

エディターとノートブックも合わせる

ターミナル側を直しても、エディターのPython選択やノートブックのカーネルは別に保存されていることがある。実行したいvenvのPythonを選び直してから、もう一度同じ診断を出す。カーネルを切り替えたつもりでも、sys.executableが期待した場所でなければ調査を続ける。

設定変更後はPythonプロセスを新しくし、短いimportと必要な計算を試す。パッケージの配置が確認できるだけでは、内部の依存関係や拡張モジュールまで正常とは限らない。場所がそろっているのに失敗する場合は、症状別のトラブルシューティングへ戻るとよい。

診断結果を共有するときの注意

出力にはユーザー名、ホームディレクトリ、プロジェクト名などが含まれることがある。相談先へ渡すときは、個人情報に当たる部分だけを置換し、AとBの違いや末尾のsite-packagesといった位置関係は残す。全文を無差別に公開する必要はない。

また、PYTHONPATHやユーザー用site-packagesの設定によって検索経路が追加されている場合もある。executableとpipだけで説明できないときはsys.pathも確認するが、その場しのぎでパスを追加し続けるのは避けたい。実行する環境を一つに決め、その環境へ必要なものを入れる方法が再現しやすい。

動作確認と参考資料

掲載例はLinux・CPython 3.12.14で動作確認した。OS固有のコマンドや環境ごとに変わるパスは、本文中の条件を確認して使ってほしい。

関連するTips


PythonのTopに戻る