何が起きたのか
Windows環境でPythonをインストールした後、python --version を実行したところ、バージョン番号ではなくPythonとだけ表示されました。
エラーも出ないため、原因が分からず少しハマったので、同じ現象で困っている方向けに原因と対処法をまとめます。
原因
原因は、PATH の探索で先に見つかった python.exe が、インストールした Python 本体ではなく、Windows に既定で用意されている「アプリ実行エイリアス(App execution aliases)」の python.exe だったためです。
Windowsでは、コマンドとして python を実行すると、PATH に登録されている順番で python.exe が探索され、最初に見つかった実行ファイルが起動されます。Windows 10/11 では WindowsApps 配下に、Microsoft Store / App Installer が提供する python.exe / python3.exe のエイリアスが存在するため、PATH の順序によってはこちらが先に起動されます。
その結果、python --version を実行してもインストールした Python のバージョンが表示されず、想定と異なる表示(Store への誘導メッセージ等)になることがあります。
PATH とは、コマンドを実行したときに、OS が実行ファイルを探しに行くディレクトリの一覧を表す環境変数です。
また、環境変数とは OS 上でプログラムが動作する際に参照される、「名前」と「値」の組み合わせで構成された設定情報のことです。
Windows では、PATH に登録されているディレクトリを上から順に確認し、最初に見つかった実行ファイルが実行されます。
なぜ、Microsoft Store版の python.exe のエイリアスが優先して実行されているのがわかったのかというと、where pythonというコマンドを実行して、WindowsApps ディレクトリ内の python.exe が表示されたためです。
解決方法
py コマンドを使う
py --version
最も簡単な確認方法です。py は Python 本体(python.exe)ではなく Python Launcher(py.exe) を起動し、ランチャーがインストール済みの Python を探索して実行します。
そのため、python コマンドが WindowsApps のエイリアスに吸われてしまうケースでも、py なら回避できることが多いです。
ただし注意点として、py は「インストールされている Python のうち、ランチャーが既定として選んだもの」を起動します。複数バージョンが入っている環境では、想定と違うバージョを選ぶ可能性があるため、必要ならバージョン指定や一覧表示を使うのが確実です。
利用可能な Python を一覧表示:
py --list-paths
特定バージョンで確認:
py -3.12 --version
「ランチャー」は一般的に“起動役”を指す言葉ですが、文脈によって意味が変わります(例:ゲームランチャーはゲーム本体の起動や更新を行うツールを指すことがあります)。
今回の Windows の Python では、py コマンドが起動する Python Launcher(py.exe) のことを指します。これは Python 本体(python.exe)を直接起動するのではなく、インストール済みの Python の中から起動するバージョンを選んで実行するための「起動用プログラム」です。
今回の学び
① 「ソフトウェア名 + --version」でバージョンが確認できると思い込んでいた
これまで、ソフトウェア名に --version を付ければ、そのソフトウェアのバージョンを確認できるものだと思い込んでいました。そのため、「コマンド名=ソフトウェア名」だと勘違いしていました。
例えば Java の場合は、java --versionでバージョンを確認できます。
しかし、VS Code の場合は、code --versionのように、ソフトウェア名(VS Code)とは異なるコマンド名(code)が使われています。
このことから、バージョン確認に使うのはソフトウェア名ではなく、OS に登録されている「コマンド名」であるということを学びました。
② py --version は py.exe を起動し、引数として --version を渡している
これまで、コマンドを実行すると「何となくバージョンが返ってくるもの」だと思っており、どのように処理されているのかを意識していませんでした。
実際には、py --version を実行すると、Windows が py.exe を起動し、--version というコマンドライン引数を渡しています。
その後、Python Launcher(py.exe)が受け取った引数を処理し、自身のバージョン情報を表示しています。
最後に
今回が初めての Qiita 記事投稿でした。内容を整理する過程で ChatGPT の力も借りながら、「人に伝えること」を意識して書いてみました。
記事としてまとめることで、今回の問題を表面的な対処で終わらせず、仕組みまで深掘りして理解できたと感じています。
今後も、学習や作業の中でつまずいたことがあれば、同じように記事として残していきたいと思います。