+ 作るログイン
図を読み込んでいます…
1 / 20
JS から来た人の Python ― どこから来て、なぜ動くのか / 全19章

Python 02:入れ方とバージョン

発行
アニメモ公式
版
第1版
改訂
コマ
全20

同じ python3 と打っても、動く Python は人によって違います。python.org・Homebrew・uv のそれぞれで入れたとき本体がどこに置かれるのか、1台に何個もの Python が同居できる理由、そして PATH という「探す順番」がどれを呼ぶかを決めている仕組みを、実際の出力で確かめます。python と python3 の違い、pip ではなく python3 -m pip と書く理由、Mac に最初からある Python に触ってはいけない理由まで扱います。

python3 --version が、人によって違うのはなぜ?

第1章で、python3 はディスクの上にある1つの実行ファイルだと分かりました。では、その実行ファイルは誰が、どこに置いたのでしょうか。

試しに、何人かで同じコマンドを打ってみると、図のように結果がばらばらになります。

人python3 --versionwhich python3
Aさん(Homebrew で入れた Mac)Python 3.13.7/opt/homebrew/bin/python3
Bさん(python.org から入れた Mac)Python 3.12.10/usr/local/bin/python3
この本を書いた LinuxPython 3.11.15/usr/local/bin/python3

同じ python3 という名前なのに、動いている Python の版も、置き場所も違います。さらに、Mac で python(3 の付かない名前)と打つと command not found と言われることがあります。

この章で答える疑問は次の3つです。

疑問一言の答え
python3 は、誰がどこに入れたもの?入れ方(python.org・Homebrew・uv など)によって置き場所が決まる
何個も入っていたら、どれが呼ばれる?PATH という「探す順番」で、最初に見つかった1つ
python と python3 は何が違う?昔の Python 2 と呼び分けたなごり。今は python3 が確実

この章を読み終えると、「pip install したのに import できない」という、Python で最も多い困りごとの半分は、自分で原因が分かるようになります。

※2026年9月時点(Python 3.13)の情報です。2025年10月に Python 3.14 も出ていますが、この章の仕組みは版によって変わりません。

  • JS から来た人の Python 02 ― 入れ方とバージョン
  • 1 / 20
  • python3 --version が、人によって違うのはなぜ?
  • Aさんの Mac
  • Bさんの Mac
  • あなたの Linux
  • $ python3 --version
  • $ python3 --version
  • $ python3 --version
  • Python 3.13.7
  • Python 3.12.10
  • Python 3.11.15
  • $ which python3
  • $ which python3
  • $ which python3
  • /opt/homebrew/bin/python3
  • /usr/local/bin/python3
  • /usr/local/bin/python3
  • 検索
  • python3 は、誰がどこに入れたもの?
  • 検索
  • 何個も入っていたら、どれが呼ばれる?
  • 検索
  • Mac で python と打つと command not found なのはなぜ?
  • 答え:Python は1台に何個でも入れられる。どれが呼ばれるかは PATH という「探す順番」で決まる
  • この章で、入れ方・置き場所・PATH・python と python3 の違いを分解する
  • ひらめき
  • 同じ python3 と打っても、動く Python は人によって違う。どこに何個入っていて、どれが呼ばれるのか。

一言でいうと:同じ名前の役者が何人もいて、PATH が出番の順番表

第1章のたとえを続けます。python3 は台本を演じる役者でした。実は、この役者は同じ名前で何人いてもかまいません。Homebrew が連れてきた python3、python.org から来た python3、Apple が最初から置いていた python3。みんな名前は python3 です。

では、あなたが python3 main.py と打ったとき、誰が舞台に上がるのでしょうか。

シェルは順番表を持っています。それが環境変数 PATH です。PATH には「役者を探しに行く楽屋(フォルダ)」が順番に並んでいて、シェルは上から順に楽屋をのぞき、python3 という名前の役者を最初に見つけたところで呼びます。

たとえ実物
役者python3 という名前の実行ファイル
楽屋/opt/homebrew/bin のようなフォルダ
出番の順番表環境変数 PATH
舞台に上がる人PATH の順で最初に見つかった python3

図では、2番目の楽屋 /opt/homebrew/bin に Homebrew の python3 がいたので、その人が呼ばれました。3番目・4番目の楽屋にも python3 はいますが、呼ばれることはありません。

大事なのは、役者が何人いても困らないということです。困るのは、「自分が呼んだつもりの役者」と「実際に舞台に上がった役者」が違うときだけです。この章では、その食い違いを自分で見つけられるようになることを目指します。

  • JS から来た人の Python 02 ― 入れ方とバージョン
  • 2 / 20
  • 一言でいうと:同じ名前の役者が何人もいて、PATH が出番の順番表
  • PATH(出番の順番表)
  • CPU
  • 3.13(Homebrew)
  • ターミナル
  • シェル
  • 1 ~/.local/bin
  • 最初に見つかった → 出番
  • python3 を呼ぶ
  • 順番表
  • 2 /opt/homebrew/bin
  • CPU
  • 3.13(python.org)
  • 3 /usr/local/bin
  • 同じ名前だが、呼ばれない
  • 4 /usr/bin
  • CPU
  • Apple のもの
  • 同じ名前だが、呼ばれない
  • ひらめき
  • python3 という名前の役者は何人いてもいい。シェルは順番表(PATH)の上から見て、最初の1人を呼ぶ。

Python の入れ方は、主に3つ(+最初から入っているもの)

Python の入れ方はいくつもありますが、Mac でよく使われるのは次の3つです。

入れ方置かれる場所(Mac の例)呼べるコマンド名特徴
python.org の配布物/Library/Frameworks/Python.framework/python3・python3.13公式がそのまま配るもの。インストーラーを実行するだけ
Homebrew/opt/homebrew/(Apple Silicon の Mac)python3・python3.13brew install python。他の道具と同じ棚に並ぶ
uv~/.local/share/uv/python/python3.13 など版を何個でも並べて、プロジェクトごとに切り替えやすい
最初から入っているもの/usr/bin/python3python3Apple の道具のためのもの。使わない・触らない

どれで入れても、中身は第1章で見た CPython です。python.org が配っているソースから作られた、同じ Python です。違うのは次の2点だけです。

違い意味
どこに置かれるか置き場所が違うので、何個入れてもぶつからない
どう更新するかpython.org なら新しいインストーラー、Homebrew なら brew upgrade、uv なら uv python install

Linux では、ディストリビューション(Ubuntu など)が /usr/bin/python3 を最初から入れていることが多く、これも Mac の Apple のものと同じく「OS が使うもの」です。Windows では、python.org の配布物などに py という起動用のコマンドが付いていて、py -3.13 のように版を指定して呼べます。この本のコマンドは macOS と Linux で書きます。

  • JS から来た人の Python 02 ― 入れ方とバージョン
  • 3 / 20
  • Python の入れ方は、主に3つ(+最初から入っているもの)
  • 入れ方
  • 置かれる場所(Mac の例)
  • コマンド名
  • 向いている人
  • python.org の配布物
  • /Library/Frameworks/Python.framework/
  • python3・python3.13
  • 公式のものを1つ入れたい
  • Homebrew
  • /opt/homebrew/(Apple Silicon)
  • python3・python3.13
  • brew で道具を揃えている
  • uv
  • ~/.local/share/uv/python/
  • python3.13(など)
  • 版を切り替えて使いたい
  • 最初から入っている
  • /usr/bin/python3
  • python3
  • 使わない(触らない)
  • この本のおすすめは uv(後で理由を書く)。ただし、どれを選んでも「仕組み」は同じ
  • Linux では OS の python3 が最初から入っていることが多い。Windows には py という起動用コマンドがある
  • ひらめき
  • どれで入れても中身は同じ CPython。違うのは「どこに置かれるか」と「どう更新するか」。

python.org で入れると:Frameworks に本体、/usr/local/bin に入口

python.org からダウンロードしたインストーラーで Mac に入れると、Python の公式ドキュメントにあるとおり、次のように置かれます。

場所置かれるもの
/Library/Frameworks/Python.framework/Python の本体(実行ファイルと、標準ライブラリなど)
/usr/local/bin/本体を指すシンボリックリンク(python3 など)
/Applications/Python 3.13/IDLE(簡単なエディタ)や、設定用の小さなプログラム

シンボリックリンクとは、「本物はあっちにあるよ」と指し示すだけの小さなファイルです。ショートカットや別名のようなものだと思ってください。/usr/local/bin/python3 を実行すると、実際には Frameworks の中の本体が動きます。

なぜわざわざ入口を別に置くのでしょうか。それは、/usr/local/bin が最初からPATH に入っていることが多いフォルダだからです。本体の深い場所を PATH に足さなくても、python3 と打つだけで呼べるようにしているのです。

入れた直後に1つだけやることがあります。/Applications/Python 3.13/ の中の Install Certificates.command をダブルクリックして実行することです。これは、Python が HTTPS で通信するときに相手が本物かを確かめるための証明書を入れる作業です。これを忘れると、後で requests などで HTTPS のサイトにつなぐときに証明書のエラーが出ることがあります。

  • JS から来た人の Python 02 ― 入れ方とバージョン
  • 4 / 20
  • python.org で入れると:Frameworks に本体、/usr/local/bin に入口
  • /Library/Frameworks/Python.framework/Versions/3.13/
  • CPU
  • bin/python3.13
  • リンク
  • /usr/local/bin/python3
  • 本体の実行ファイル
  • 本体を指すリンク(入口)
  • フォルダ
  • lib/python3.13/
  • 守られている
  • Install Certificates
  • 標準ライブラリ(json など)と site-packages
  • 入れた後に1回実行する
  • Applications に「Python 3.13」フォルダもでき、その中の Install Certificates.command で HTTPS 用の証明書を入れる
  • ひらめき
  • 本体は /Library/Frameworks の下。/usr/local/bin には本体を指す「入口」が置かれる。

Homebrew で入れると:/opt/homebrew/bin に並ぶ

Mac の道具を Homebrew で揃えている人は、Python も Homebrew で入れることが多いでしょう。

bash
$ brew install python
$ which python3
/opt/homebrew/bin/python3

Apple Silicon(M1 以降)の Mac では、Homebrew は /opt/homebrew/ の下に物を置き、コマンドを /opt/homebrew/bin/ に並べます。Intel の Mac では /usr/local/ の下です。node や git を Homebrew で入れていれば、それらと同じ棚に python3 が並ぶことになります(第1章で which node と同じフォルダが出たのはこのためです)。

Homebrew の Python には、知っておくべき癖がいくつかあります。

癖内容
python は PATH に無い置かれるのは python3 など。3 の付かない python は libexec/bin という別のフォルダにあり、既定では PATH に入っていない
pip で直接入れられないHomebrew の Python は「外部で管理されている」印が付いていて、pip install するとエラーになる(後で見る)
brew upgrade で版が上がる他の道具を更新したついでに Python の版が変わることがある。古い版で作った仮想環境(第12章)が動かなくなることも

3つ目は、JS で言えば「brew で入れた node が勝手に新しくなって、node_modules の一部が動かなくなった」のと似た事故です。そのため、プロジェクトで使う Python の版を自分で決めて固定したいときは、次の uv のほうが向いています。

  • JS から来た人の Python 02 ― 入れ方とバージョン
  • 5 / 20
  • Homebrew で入れると:/opt/homebrew/bin に並ぶ
  • $ brew install python
  • 気をつけること
  • 内容
  • $ which python3
  • /opt/homebrew/bin/python3
  • python は無い
  • python3 と打つ
  • /opt/homebrew/bin/(Apple Silicon の Mac)
  • pip で直接入れられない
  • externally-managed(後で)
  • python3
  • node
  • git
  • brew upgrade で上がる
  • 古い venv が動かないことも
  • Intel の Mac では /usr/local/bin
  • ひらめき
  • brew install python で入る。python3 は /opt/homebrew/bin に、node や git と並ぶ。

uv で入れると:自分のホームの下に、版ごとに並ぶ

uv は、Python のパッケージ管理を速く・まとめてやるための道具です(第13章で詳しく見ます)。uv は、ライブラリを入れるだけでなく、Python 本体を入れることもできます。この本を書いた Linux で実際に試した結果がこちらです。

bash
$ uv python install 3.13
Installed Python 3.13.7 in 2.46s
 + cpython-3.13.7-linux-x86_64-gnu (python3.13)
$ ls -l ~/.local/bin/python3.13
... python3.13 -> /root/.local/share/uv/python/cpython-3.13.7-linux-x86_64-gnu/bin/python3.13
読み取れること意味
~/.local/share/uv/python/cpython-3.13.7-…/本体の置き場所。版・OS・CPU の種類ごとに別のフォルダ
~/.local/bin/python3.13本体を指すシンボリックリンク(入口)
(python3.13)入口の名前。`python3` ではなく `python3.13`

uv の公式ドキュメントによれば、uv は Python を自分で一から作るのではなく、python-build-standalone という、あらかじめ作っておいた持ち運びやすい CPython をダウンロードして置いています。Mac でも同じ仕組みで、フォルダ名の linux-x86_64-gnu の部分が Mac 用の名前になります。

ポイントは、入口として置かれるのが python3.13 という版の番号付きの名前だけだということです。python3 や python という名前は、uv python install --default と付けたときだけ置かれます(uv のドキュメントでは、この --default はまだ試験的な機能とされています)。つまり uv は、あなたが今まで使っていた python3 を勝手に乗っ取りません。

さらに uv は、必要な版が入っていなければ、その場で自動でダウンロードしてくれます。版の違う Python を何個でも並べられるので、「このプロジェクトは 3.12、あちらは 3.13」という使い分けが楽になります。

  • JS から来た人の Python 02 ― 入れ方とバージョン
  • 6 / 20
  • uv で入れると:自分のホームの下に、版ごとに並ぶ
  • $ uv python install 3.13
  • Installed Python 3.13.7 in 2.46s
  • + cpython-3.13.7-linux-x86_64-gnu (python3.13)
  • $ ls -l ~/.local/bin/python3.13
  • python3.13 -> ~/.local/share/uv/python/cpython-3.13.7-linux-x86_64-gnu/bin/python3.13
  • ~/.local/share/uv/python/(3つの版を入れた例)
  • リンク
  • ~/.local/bin/python3.13
  • cpython-3.12.x-…
  • cpython-3.13.7-…
  • cpython-3.14.x-…
  • 版の番号付きの入口だけ
  • ひらめき
  • uv python install 3.13 で、~/.local/share/uv/python/ に版ごとのフォルダができる。

1台のパソコンに、何個もの Python が同居している

ここまでで、置き場所がばらばらなことが分かりました。置き場所が違うので、何個入れてもお互いにぶつかりません。実際、この本を書いた Linux で uv python list --only-installed と打つと、次のように何個も見つかりました(読みやすく一部を省略しています)。

cpython-3.13.12-linux-x86_64-gnu    /usr/bin/python3.13
cpython-3.13.7-linux-x86_64-gnu     ~/.local/bin/python3.13 -> ~/.local/share/uv/python/…
cpython-3.12.3-linux-x86_64-gnu     /usr/bin/python3.12
cpython-3.11.15-linux-x86_64-gnu    /usr/local/bin/python3 -> /usr/bin/python3.11
cpython-3.10.20-linux-x86_64-gnu    /usr/bin/python3.10
見つかったもの誰が置いたか
3.13.12OS のパッケージ
3.13.7uv(前に入れたもの)
3.12・3.10OS のパッケージ
3.11.15OS のパッケージ。/usr/local/bin/python3 という入口がこれを指している

5つも入っています。ところが、この環境で python3 と打って動くのは 3.11 です。なぜ、新しい 3.13 ではないのでしょうか。

答えは、python3 という名前の入口が、PATH の順で最初に見つかるのが /usr/local/bin/python3 で、それが 3.11 を指しているからです。3.13 は python3.13 という別の名前で呼ばないと出てきません。

新しい版を入れたのに古い版が動く、というのはよくあることです。それは「入っていない」のではなく、「呼ばれていない」のです。次に、その「呼ばれる順番」である PATH を、1段ずつ見ていきます。

  • JS から来た人の Python 02 ― 入れ方とバージョン
  • 7 / 20
  • 1台のパソコンに、何個もの Python が同居している
  • $ uv python list --only-installed # この本を書いた Linux で実際に打った結果(一部)
  • cpython-3.13.12-linux-x86_64-gnu /usr/bin/python3.13
  • cpython-3.13.7-linux-x86_64-gnu ~/.local/bin/python3.13 -> ~/.local/share/uv/python/…
  • cpython-3.12.3-linux-x86_64-gnu /usr/bin/python3.12
  • cpython-3.11.15-linux-x86_64-gnu /usr/local/bin/python3 -> /usr/bin/python3.11
  • cpython-3.10.20-linux-x86_64-gnu /usr/bin/python3.10
  • 3.13(OS)
  • 3.13(uv)
  • 3.12
  • 3.11 ← python3
  • 3.10
  • 5つも入っているのに、python3 と打って動くのは 3.11 だけ。それを決めているのが PATH
  • ひらめき
  • 置き場所が違うので、同居してもぶつからない。問題は「どれが呼ばれるか」だけ。

PATH は「コマンドを探すフォルダ」を : でつないだ1行の文字

PATH は、シェルが覚えている環境変数の1つです。環境変数とは、シェルや、シェルから起動したプログラムが読める「名前つきの文字」のことです。中身は echo $PATH で見られます。

bash
$ echo $PATH
/Users/you/.local/bin:/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin

ただの1行の文字です。:(コロン)で区切られた1つ1つが、コマンドを探しに行くフォルダです。図では、Mac に python.org・Homebrew・uv の3つで Python を入れた場合の例を、4枚のカードに並べました。

番号フォルダそこにある Python
1~/.local/binuv が置いた python3.13(python3 という名前は無い)
2/opt/homebrew/binHomebrew の python3
3/usr/local/binpython.org の python3
4/usr/binApple の python3

PATH の中身は、シェルが起動するときに読む設定ファイルで決まります。Mac の zsh なら ~/.zprofile や ~/.zshrc、Linux の bash なら ~/.bashrc などです。Homebrew や uv を入れたときに「この行をシェルの設定に足してください」と言われたことがあるなら、それはこの PATH に自分のフォルダを足すためでした。

JS で nvm を入れたときにも、同じように設定ファイルに行を足したはずです。あれも、nvm の置いた node を PATH で見つけられるようにするためです。

  • JS から来た人の Python 02 ― 入れ方とバージョン
  • 8 / 20
  • PATH は「コマンドを探すフォルダ」を : でつないだ1行の文字
  • $ echo $PATH
  • /Users/you/.local/bin:/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin
  • フォルダ
  • ~/.local/bin
  • フォルダ
  • /opt/homebrew/bin
  • フォルダ
  • /usr/local/bin
  • フォルダ
  • /usr/bin
  • python3.13(uv)
  • python3(Homebrew)
  • python3(python.org)
  • python3(Apple)
  • python3 は無い
  • 3.13
  • 3.13
  • 少し古い版
  • Mac で python.org・Homebrew・uv の全部で入れた場合の例。: で区切られた1つ1つがフォルダ
  • PATH は環境変数(シェルが覚えている名前つきの文字)。シェルの設定ファイル(~/.zshrc など)で決まる
  • ひらめき
  • echo $PATH で中身が見られる。左から順に、コマンドを探すフォルダが並んでいる。

シェルは左から探し、最初に見つかった python3 を起動する

では、python3 と打ったときに何が起きるかを、図の小包で追ってみます。

順番シェルがやること結果
1~/.local/bin/python3 があるか見る無い(python3.13 はあるが、名前が違う)
2/opt/homebrew/bin/python3 があるか見るある。これを起動して終わり
3/usr/local/bin/python3見にも行かない
4/usr/bin/python3見にも行かない

大事なことが2つあります。

1つ目は、名前が完全に一致するものだけが当たることです。~/.local/bin には python3.13 がありますが、python3 とは別の名前なので素通りします。逆に python3.13 と打てば、1番目のフォルダで見つかり、uv の 3.13 が動きます。

2つ目は、最初の1つが見つかったら、そこで探すのをやめることです。3番目・4番目にも python3 はありますが、シェルはもう見に行きません。だから、Python がいくつ入っていても、python3 と打って動くのは常に1つだけです。

ちなみに、zsh や bash は、一度見つけたコマンドの場所を覚えておくことがあります。新しく Python を入れたのに古い場所のものが動き続けるときは、ターミナルを開き直すか、zsh なら rehash、bash なら hash -r と打つと、探し直してくれます。

  • JS から来た人の Python 02 ― 入れ方とバージョン
  • 9 / 20
  • シェルは左から探し、最初に見つかった python3 を起動する
  • $ echo $PATH
  • /Users/you/.local/bin:/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin
  • フォルダ
  • ~/.local/bin
  • フォルダ
  • /opt/homebrew/bin
  • フォルダ
  • /usr/local/bin
  • フォルダ
  • /usr/bin
  • python3.13(uv)
  • python3(Homebrew)
  • python3(python.org)
  • python3(Apple)
  • python3 は無い
  • NG
  • 3.13
  • OK
  • 3.13
  • 少し古い版
  • python3 を探す
  • 3番目・4番目にも python3 はあるが、見にも行かない。「最初の1つ」で探すのをやめる
  • 名前が完全に同じファイルだけが当たる。python3.13 は python3 とは別の名前
  • ひらめき
  • 1番目には python3 が無い(python3.13 だけ)。2番目で見つかり、Homebrew のものが動く。

PATH の並びを変えると、呼ばれる python3 が変わる

PATH の並びを変えると、同じ python3 と打っても、別の Python が動きます。試しに、/usr/local/bin を先頭に足してみます。

bash
$ export PATH="/usr/local/bin:$PATH"
$ echo $PATH
/usr/local/bin:/Users/you/.local/bin:/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin
$ which python3
/usr/local/bin/python3

export PATH="フォルダ:$PATH" は、「今の PATH の先頭にフォルダを足す」という意味です。$PATH の部分に今までの中身が入るので、/usr/local/bin が2回出てきますが、先に見つかるほうが使われるだけなので問題はありません。

図では、カードの並びが変わり、先頭に来た python.org の python3 が呼ばれるようになりました。入っているものは何も変わっていません。変わったのは並びだけです。

書き方効き目
ターミナルで export PATH=...そのターミナルを閉じるまで
~/.zshrc などに書く新しく開くターミナルすべてで

この「PATH の先頭にフォルダを足して、呼ばれるコマンドを差し替える」という技は、この本でもう一度、大事な場面で出てきます。第12章の仮想環境で source .venv/bin/activate と打つとき、裏でやっていることはこれとほとんど同じです。activate は魔法ではなく、PATH の先頭に .venv/bin を足しているだけなのです。

  • JS から来た人の Python 02 ― 入れ方とバージョン
  • 10 / 20
  • PATH の並びを変えると、呼ばれる python3 が変わる
  • $ export PATH="/usr/local/bin:$PATH"
  • /usr/local/bin:/Users/you/.local/bin:/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin
  • フォルダ
  • /usr/local/bin
  • フォルダ
  • ~/.local/bin
  • フォルダ
  • /opt/homebrew/bin
  • フォルダ
  • /usr/bin
  • python3(python.org)
  • python3.13(uv)
  • python3(Homebrew)
  • python3(Apple)
  • 3.13
  • OK
  • python3 は無い
  • 3.13
  • 少し古い版
  • python3 を探す
  • export PATH="フォルダ:$PATH" は「先頭に足す」。venv の activate も同じこと(第12章)
  • export はそのターミナルだけで有効。ずっと使うなら ~/.zshrc に書く
  • ひらめき
  • /usr/local/bin を先頭に置くと、python3 で python.org のものが動く。変えたのは並びだけ。

今どれが呼ばれるかは、3つのコマンドで確かめる

PATH の仕組みが分かったら、「今、どれが呼ばれるのか」を確かめる方法を持っておきましょう。この本を書いた Linux で実際に打った結果です。

bash
$ which python3
/usr/local/bin/python3
$ which -a python3
/usr/local/bin/python3
/usr/bin/python3
/bin/python3
$ python3 -c "import sys; print(sys.executable)"
/usr/local/bin/python3
コマンド分かること
which python3PATH の順で最初に見つかる1つ(=打ったら動くもの)
which -a python3PATH 上にある候補すべてを、探す順に
python3 -c "import sys; print(sys.executable)"いま実際に動いている Python が、自分をどこから起動されたと思っているか
python3 --versionその Python の版

which はシェルの側から見た答え、sys.executable は Python の側から見た答えです。`sys` は Python に最初から入っている標準ライブラリの1つで、動いている Python 自身についての情報を持っています。

普段はどちらも同じ答えになりますが、エディタから実行したとき、別の道具から起動されたときなどは、sys.executable のほうが確実です。プログラムの中に一時的に print(sys.executable) と書いておけば、「このコードを、どの Python が動かしているのか」を必ず確かめられます。

zsh では which -a の代わりに where python3、bash では type -a python3 でも同じように候補の一覧が見られます。

  • JS から来た人の Python 02 ― 入れ方とバージョン
  • 11 / 20
  • 今どれが呼ばれるかは、3つのコマンドで確かめる
  • $ which python3
  • コマンド
  • 分かること
  • /usr/local/bin/python3
  • $ which -a python3
  • which
  • PATH の順で最初の1つ
  • /usr/local/bin/python3
  • /usr/bin/python3
  • which -a
  • PATH 上の候補すべて
  • /bin/python3
  • $ python3 -c "import sys; print(sys.executable)"
  • sys.executable
  • 動いている Python 自身
  • /usr/local/bin/python3
  • python3 --version
  • その版
  • Linux で実際に打った結果。候補は3つ見つかった
  • ひらめき
  • which は呼ばれる1つ、which -a は候補の全部、sys.executable は動いている Python 自身。

python と python3:名前が2つあるのは、昔の Python 2 のなごり

なぜ Python には python と python3 という2つの名前があるのでしょうか。

理由は歴史にあります。Python 3 は、Python 2 と書き方に互換性のない大きな変更でした。そのため長い間、1台のパソコンに Python 2 と Python 3 が同居していて、python と打つと Python 2、python3 と打つと Python 3 が動く、という呼び分けが広まりました。Python 2 はすでに 2020 年に開発が終わっていますが、この呼び分けは今も残っています。

環境pythonpython3
Mac(何も入れていない)無い。macOS 12.3 で Python 2 ごと削除された/usr/bin/python3(Apple のもの)
Homebrew既定では PATH に無い(libexec/bin にある)/opt/homebrew/bin/python3
uv で入れた--default を付けたときだけ--default を付けたときだけ(普段は python3.13)
仮想環境の中(第12章)ある。中の Python を指すある。同じもの
Windows入れ方と設定による(py と打つのが確実)環境による

Mac で python と打って zsh: command not found: python と言われるのは、これが理由です。ネットの記事で python main.py と書いてあっても、Mac では python3 main.py と読み替えてください。

逆に、第12章で作る仮想環境を有効にした後は、python という名前が使えるようになり、python でも python3 でも同じものが動きます。多くの記事が python と書いているのは、仮想環境の中で作業している前提だからです。

JS には node2 と node3 のような呼び分けはありませんでした。ここは Python 特有の事情です。

  • JS から来た人の Python 02 ― 入れ方とバージョン
  • 12 / 20
  • python と python3:名前が2つあるのは、昔の Python 2 のなごり
  • 環境
  • python
  • python3
  • Mac(何も入れていない)
  • 無い(macOS 12.3 で Python 2 ごと削除)
  • /usr/bin/python3(Apple のもの)
  • Homebrew
  • 既定では PATH に無い(libexec/bin)
  • /opt/homebrew/bin/python3
  • uv で入れた
  • --default を付けたときだけ
  • --default を付けたときだけ
  • venv の中(第12章)
  • ある(中の Python を指す)
  • ある(同じもの)
  • Windows
  • 設定による(py が確実)
  • 環境による
  • 迷ったら python3 と打つ。venv を有効にした後なら python でも同じものが動く(第12章)
  • JS には node2・node3 のような呼び分けが無かったので、ここは Python 特有の事情
  • ひらめき
  • Python 2 と同居していた頃に 3 を python3 と呼び分けた。今も python3 が確実な名前。

pip と打つと、別の Python の pip が動くことがある

Python のライブラリを入れる道具 pip も、python3 と同じように PATH で探されるただのコマンドです。そして、ここに落とし穴があります。この本を書いた Linux で実際に打った結果を見てください。

bash
$ pip --version
pip 24.0 from /usr/lib/python3/dist-packages/pip (python 3.11)
$ python3.13 -m pip --version
pip 24.3.1 from /root/.local/share/uv/python/cpython-3.13.7-linux-x86_64-gnu/lib/python3.13/site-packages/pip (python 3.13)

行の最後の (python 3.11) と (python 3.13) に注目してください。これは「この pip は、どの Python のためにライブラリを入れるか」です。

打ったもの動いた pipライブラリが入る先
pipPATH で最初に見つかった pip。3.11 用だった3.11 の置き場所
python3.13 -m pip3.13 の中の pip3.13 の置き場所

もし pip install requests と打ってから python3.13 main.py で実行すると、requests は 3.11 の置き場所に入り、3.13 はそれを探せません。結果は ModuleNotFoundError: No module named 'requests' です。入れた Python と、動かした Python が別人だったのです。

pip は Python ごとに1つずつあり、「自分の Python の置き場所」にだけライブラリを入れます。ライブラリの置き場所(site-packages)の話は第11章で詳しく見ますが、ここでは「pip と python3 は、別々に PATH で探される」ことだけ押さえてください。

  • JS から来た人の Python 02 ― 入れ方とバージョン
  • 13 / 20
  • pip と打つと、別の Python の pip が動くことがある
  • $ pip --version
  • pip 24.0 from /usr/lib/python3/dist-packages/pip (python 3.11)
  • $ python3.13 -m pip --version
  • pip 24.3.1 from ~/.local/share/uv/python/cpython-3.13.7-…/site-packages/pip (python 3.13)
  • 修理
  • pip
  • フォルダ
  • 3.11 の棚
  • CPU
  • python3.13 で実行
  • 3.11 用の pip が動いた
  • ここに入る
  • 3.13 の棚には無い → 動かない
  • Linux で実際に打った結果。末尾の (python 3.x) が「どの Python 用の pip か」
  • ひらめき
  • pip もただのコマンド。PATH で最初に見つかった pip が、どの Python 用かは別の話。

python3 -m pip は「この python3 の pip」と名指しする書き方

この食い違いを防ぐのが、第1章でも少し出てきた -m です。python3 -m pip install requests と打つと、次の順で動きます。

順番起きること
1シェルが PATH で python3 を探して起動する(ここは普通と同じ)
2その python3 が、自分が探せる場所から pip という名前のモジュールを探す
3見つけた pip を実行する。その pip は、その python3 の置き場所にライブラリを入れる

Python の公式ドキュメントによれば、-m は「モジュールを sys.path から探して、その中身を実行する」オプションです。`sys.path` は「その Python が探しに行くフォルダの一覧」で、第8章の主役です。大事なのは、sys.path はPython ごとに違うということです。だから python3.13 -m pip と書けば、必ず 3.13 の pip が動きます。

つまり python3 -m pip は、「PATH で python3 を探すのは1回だけにして、pip はその python3 自身に選ばせる」書き方です。探す回数が1回になるので、食い違いが起きません。

よく使う -m何をする章
python3 -m pip install requestsこの Python にライブラリを入れる第11章
python3 -m venv .venvこの Python を元に仮想環境を作る第12章
python3 -m json.toolJSON を整形する第1章
python3 -m http.server今いるフォルダを配る簡単な Web サーバーを起動する―

pip の公式ドキュメントでも、コマンドの例は python -m pip の形で書かれています。この本でも、pip は基本的に python3 -m pip と書きます。

  • JS から来た人の Python 02 ― 入れ方とバージョン
  • 14 / 20
  • python3 -m pip は「この python3 の pip」と名指しする書き方
  • CPU
  • python3.13
  • 検索
  • pip という名前を探す
  • 再生
  • 見つけた pip を実行
  • まずこれが起動する
  • 自分の探す場所(第8章)から
  • 3.13 の棚に入れる
  • よく使う -m
  • 何をする
  • python3 -m pip install requests
  • この Python にライブラリを入れる(第11章)
  • python3 -m venv .venv
  • この Python を元に仮想環境を作る(第12章)
  • python3 -m json.tool
  • JSON を整形する(第1章)
  • ひらめき
  • -m は、その Python が探せる場所から pip を探して実行する。だから pip と Python が一致する。

Mac に最初からある Python には、触らない

Mac には、何もしなくても /usr/bin/python3 があります。Python の公式ドキュメントには、これについて次のような説明があります。

公式ドキュメントの説明(要約)意味
Apple の開発ツール(Xcode や Command Line Tools)が提供し、それらのために使うものあなたのためではなく、Apple の道具のための Python
多くの場合、古く、機能が一部欠けている版新しい書き方やライブラリが使えないことがある
変更したり、削除しようとしたりしてはいけないApple の管理下にあり、他のソフトが頼っている

具体的にやってはいけないのは、/usr/bin/python3 を消す・置き換えることと、sudo pip install で中にライブラリを足すことです。OS や他の道具が前提にしている状態を壊してしまいます。代わりに、自分用の Python を別に入れて、そちらを使います。前に見た3つの入れ方は、どれもそのためのものです。

同じ考え方を、Python の世界は仕組みとして持っています。PEP 668(Python の改善提案の668番)で決められた「外部で管理されている環境」の印です。OS や Homebrew、uv が管理する Python にはこの印が付いていて、pip で直接入れようとすると断られます。uv で入れた Python で実際に試した結果がこちらです。

$ python3 -m pip install requests
error: externally-managed-environment

× This environment is externally managed
╰─> This Python installation is managed by uv and should not be modified.

このエラーが出たら、「ここに直接入れるな、仮想環境(venv)を作ってその中に入れなさい」という意味です(第12章)。--break-system-packages を付ければ無理やり入れられますが、名前のとおり壊す危険があるので使いません。

  • JS から来た人の Python 02 ― 入れ方とバージョン
  • 15 / 20
  • Mac に最初からある Python には、触らない
  • 錠
  • /usr/bin/python3
  • $ python3 -m pip install requests
  • error: externally-managed-environment
  • Xcode の Command Line Tools が使う。Apple の管理下
  • × This environment is externally managed
  • ╰─> This Python installation is managed
  • NG
  • 消す・置き換える
  • by uv and should not be modified.
  • hint: See PEP 668 for the detailed
  • NG
  • sudo pip install で中にライブラリを足す
  • specification.
  • OK
  • 別の Python を入れて、そちらを使う
  • uv の Python に直接 pip したときの実際のエラー
  • ひらめき
  • /usr/bin/python3 は Apple の道具のためのもの。消したり、sudo pip で書き換えたりすると壊れる。

この本のおすすめ:uv で Python を入れ、プロジェクトごとに版を決める

入れ方はどれを選んでも、仕組みは同じです。そのうえで、この本では uv をおすすめします。

理由中身
版を並べられる3.12 も 3.13 も同居させて、プロジェクトごとに選べる
OS を汚さない自分のホームの下(~/.local/share/uv/)に置く。sudo が要らない
プロジェクトに版を書ける.python-version というファイルで、そのフォルダで使う版を決められる
後の章でも使う仮想環境もライブラリも、同じ uv で扱える(第13章)

uv そのものは、公式の手順どおり1行で入れられます(Homebrew を使っているなら brew install uv でも入ります)。そのあと、tenki で使う版を決めます。この本を書いた環境で実際に打った結果です。

bash
$ curl -LsSf https://astral.sh/uv/install.sh | sh
$ uv python install 3.13
$ cd tenki
$ uv python pin 3.13
Pinned `.python-version` to `3.13`
$ cat .python-version
3.13
$ uv run python --version
Python 3.13.7

uv python pin 3.13 は、今いるフォルダに .python-version という1行だけのファイルを作ります。以後、このフォルダで uv run python ... と打つと、uv がこのファイルを読んで 3.13 を選んで動かします。PATH でどの python3 が先に見つかるかに関係なく、プロジェクトが自分の版を決められるのです。

この「uv run」の中で何が起きているかは、仮想環境(第12章)と依存の管理(第13章)を見た後で分解します。今はまず、python3 が何者かを確かめられることのほうが大事です。

  • JS から来た人の Python 02 ― 入れ方とバージョン
  • 16 / 20
  • この本のおすすめ:uv で Python を入れ、プロジェクトごとに版を決める
  • # uv を入れる(公式の手順)
  • tenki/
  • $ curl -LsSf https://astral.sh/uv/install.sh | sh
  • # Python 3.13 を入れる
  • 書類
  • main.py
  • $ uv python install 3.13
  • # tenki では 3.13 を使うと決める
  • $ cd tenki
  • 書類
  • .python-version(中身は 3.13 の1行)
  • $ uv python pin 3.13
  • Pinned `.python-version` to `3.13`
  • 理由
  • 中身
  • 版を並べられる
  • 3.12 も 3.13 も同居
  • OS を汚さない
  • ホームの下に置く
  • ひらめき
  • uv は Python 本体も入れられる。.python-version を置けば、その版が自動で使われる。

JS との対比:nvm と .nvmrc、uv と .python-version

ここまでの話は、JS の世界にもほとんどそのまま対応するものがあります。

やりたいことJS(Node.js)Python
言語そのものを入れるnodejs.org のインストーラー・brew・nvmpython.org のインストーラー・brew・uv
複数の版を切り替えるnvm・fnm・Voltauv・pyenv
プロジェクトの版を書くファイル.nvmrc・.node-version.python-version
どれが動いているか確かめるwhich node・node -vwhich python3・python3 --version
入口を差し替える仕組みPATH(nvm use が PATH を書き換える)PATH(activate・第12章)

JS 側の仕組みも一言で説明し直しておくと、nvm は Node.js の版ごとに別のフォルダに置き、nvm use 20 と打つと、PATH の先頭をその版のフォルダに書き換えます。だから node と打つと 20 系が動くのです。

Python でも、考え方は全く同じです。「版ごとに別の場所に置き、PATH で入口を差し替える」。違うのは道具の名前だけです。

1つだけ違うのは、Python には「Mac に最初から入っている Python」がある点です。Node.js は最初から入っていないので、自分で入れたものしかありません。Python では、自分で入れたものと OS のものが同じ `python3` という名前で並ぶので、PATH の順番がより大事になります。

  • JS から来た人の Python 02 ― 入れ方とバージョン
  • 17 / 20
  • JS との対比:nvm と .nvmrc、uv と .python-version
  • やりたいこと
  • JS(Node.js)
  • Python
  • 言語そのものを入れる
  • nodejs.org・brew・nvm
  • python.org・brew・uv
  • 複数の版を切り替える
  • nvm・fnm・Volta
  • uv・pyenv
  • プロジェクトの版を書く
  • .nvmrc・.node-version
  • .python-version
  • どれが動いているか
  • which node・node -v
  • which python3・python3 --version
  • 入口を差し替える方法
  • PATH(nvm use)
  • PATH(activate・第12章)
  • 考え方は全く同じ。「版ごとに別の場所に置き、PATH で入口を差し替える」
  • ひらめき
  • 「言語の版を切り替える道具」と「プロジェクトで使う版を書くファイル」は、JS にも Python にもある。

よくある間違い:入れたのに、無いと言われる

この章の知識で解けるエラーを並べます。ほとんどの原因は、「入れた Python」と「動かした Python」が別人であることです。

エラー・症状原因直し方
ModuleNotFoundError: No module named 'requests'pip が、動かしたのとは別の Python に入れたpython3 -m pip install requests で入れ直す。さらに良いのは venv を使うこと(第12章)
zsh: command not found: pythonpython という名前が PATH のどこにも無いpython3 と打つ。venv を有効にした後なら python でも動く
error: externally-managed-environmentOS や Homebrew・uv が管理している Python に直接入れようとした仮想環境を作って、その中に入れる(第12章)
新しい版を入れたのに、古い版が動くPATH の順で、古いほうの python3 が先に見つかるwhich -a python3 で並びを確かめる。ターミナルを開き直す

1つ目のエラーは、この本の中で何度も出てきます。第8章では「Python はどのフォルダを探して、見つからなかったのか」、第11章では「pip はどのフォルダに置いたのか」という両側から見て、完全に分解します。

ここでは、エラーが出たらまず「どの Python が動いたのか」を確かめる、という習慣だけ身につけてください。確かめ方は次にまとめます。

  • JS から来た人の Python 02 ― 入れ方とバージョン
  • 18 / 20
  • よくある間違い:入れたのに、無いと言われる
  • ModuleNotFoundError: No module named 'requests'
  • pip が別の Python に入れた
  • python3 -m pip で入れる
  • zsh: command not found: python
  • python という名前が PATH に無い
  • python3 と打つ(venv の中なら python)
  • error: externally-managed-environment
  • OS や brew・uv が管理する Python に直接入れた
  • venv を作ってその中に入れる(第12章)
  • 入れたのに古い版が動く
  • PATH の順で別のものが先に見つかる
  • which -a python3 で並びを確かめる
  • ひらめき
  • 原因のほとんどは「入れた Python」と「動かした Python」が別人であること。PATH と -m で防げる。

困ったら、まずこの3行

Python の環境で迷子になったら、まず次の3行を打ちます。

bash
$ which -a python3
$ python3 -c "import sys; print(sys.executable, sys.version)"
$ python3 -m pip --version
行分かること見るところ
1行目PATH 上の python3 の候補と、その順番一番上が、打ったら動くもの
2行目実際に動く Python の場所と版思っている版か
3行目その Python の pip の場所(python 3.x) が2行目の版と同じか

この3行で、「どの python3 が、どの版で、どの pip とつながっているか」が分かります。ほとんどの迷子は、この3つのどこかに食い違いがあります。

tenki では、uv で版を決めたので、確かめ方も簡単です。tenki のフォルダで次のように打ちます。

bash
$ uv run python --version
Python 3.13.7

.python-version に書いた 3.13 が使われていることが分かります。第12章以降、仮想環境を使うようになると、確かめる場所が「PATH の上の python3」から「.venv/bin/python」に変わりますが、確かめ方の考え方は同じです。

  • JS から来た人の Python 02 ― 入れ方とバージョン
  • 19 / 20
  • 困ったら、まずこの3行
  • $ which -a python3
  • $ python3 -c "import sys; print(sys.executable, sys.version)"
  • 太陽
  • tenki では
  • $ python3 -m pip --version
  • uv python pin 3.13 で版を固定
  • tenki のフォルダで
  • 1行目
  • 候補の全部と、その順番
  • uv run python --version と打つと、
  • 2行目
  • 実際に動く Python と版
  • .python-version の 3.13 が使われる
  • 3行目
  • その Python の pip の場所
  • ひらめき
  • どの python3 が、どの版で、どの pip とつながっているか。この3行でほとんどの迷子は見つかる。

まとめ:どの Python が動くかは、置き場所と PATH で決まる

この章で見たことをまとめます。

項目内容
入れ方python.org・Homebrew・uv。どれも中身は CPython で、違うのは置き場所と更新のしかた
置き場所python.org は /Library/Frameworks/、Homebrew は /opt/homebrew/、uv は ~/.local/share/uv/python/
同居置き場所が違うので、版も入れ方も違う Python が何個でも並べられる
PATHコマンドを探すフォルダの並び。左から探し、名前が一致した最初の1つを起動する
python と python3Python 2 のなごり。迷ったら python3。仮想環境の中なら python でも同じ
python3 -m pip「この python3 の pip」と名指しする。pip 単体より確実
触らない PythonMac の /usr/bin/python3 や、外部で管理されている Python には直接入れない

第1章と第2章で、「python3 とは何で、どれが動くのか」という、Python を動かす前提が分かりました。次は、いよいよその python3 に読ませる .py の中身です。

次の第3章では、Python の基本の文法を JS と並べて見ていきます。{ } の代わりのインデント、let や const が無い変数、=== が無い比較。JS から来た人が「あれ?」となるところを、1つずつ確かめます。

  • JS から来た人の Python 02 ― 入れ方とバージョン
  • 20 / 20
  • まとめ:どの Python が動くかは、置き場所と PATH で決まる
  • 項目
  • この章で見たこと
  • 入れ方
  • python.org・Homebrew・uv。どれも中身は CPython。置き場所が違う
  • 同居
  • 版も入れ方も違う Python が、1台に何個でも並べられる
  • PATH
  • コマンドを探すフォルダの並び。左から探し、最初の1つを起動する
  • python と python3
  • Python 2 のなごり。迷ったら python3。venv の中なら python
  • python3 -m pip
  • 「この Python の pip」と名指しする。pip 単体より確実
  • 触らない Python
  • Mac の /usr/bin/python3。OS や道具が管理するものに直接入れない
  • ひらめき
  • では、python3 が読む .py の中身はどう書くのか。次の第3章で、Python の文法を JS と並べて見る。

0 件のコメント

読み込み中…

権利侵害・不適切な内容の連絡: [email protected]