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

Python 01:Python はどこで動くのか

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

python3 main.py と打ったとき、パソコンの中では何が起きているのか。「Python」の正体はディスク上の実行ファイル(インタプリタ)で、node と同じ立場にあることを、which コマンドで実物を見つけて確かめます。シェルが python3 を探し、python3 が .py を読み、バイトコードに翻訳し、仮想マシンが実行する4段の流れ、__pycache__ の正体、REPL、ブラウザで Python が動かない理由まで分解します。

python3 main.py と打つと、何が起きている?

第0章で、この本では tenki という天気のコマンドを育てると書きました。その最初の一歩は、main.py というファイルを書いて、ターミナルで次の1行を打つことです。

bash
$ python3 main.py
東京:晴れ 24度

これから何百回も打つことになる1行です。でも、ここで立ち止まって考えてみると、分からないことがいくつもあります。

疑問この章での答え
python3 って、どこにある何?ディスクの上にある、1つの実行ファイル(プログラム)
main.py は、どう読まれている?python3 が文字として読み、命令の列に翻訳してから実行する
node main.js と何が違う?立場はほぼ同じ。どちらも「ファイルを読んで動かすプログラム」
ブラウザでは、なぜ動かない?ブラウザには JS のエンジンしか入っていないから

答えを先に言ってしまうと、python3 はただのプログラムです。あなたのパソコンのどこかのフォルダに置かれた1つのファイルで、main.py という「文字のファイル」を渡されると、それを読んで、翻訳して、実行します。JS の node とほとんど同じ立場にいます。

この章では、その python3 をパソコンの中で実際に見つけ、python3 main.py の1行で起きていることを4つの段に分けて見ていきます。

※2026年9月時点(Python 3.13)の情報です。

  • JS から来た人の Python 01 ― Python はどこで動くのか
  • 1 / 19
  • python3 main.py と打つと、何が起きている?
  • $ python3 main.py
  • 検索
  • python3 って、どこにある何?
  • 東京:晴れ 24度
  • 検索
  • main.py は、どう読まれている?
  • 答えを先に言うと:python3 はただのプログラム
  • (実行ファイル)で、main.py を
  • 検索
  • node main.js と何が違う?
  • 「読んで、翻訳して、実行する」係です
  • 検索
  • ブラウザでは、なぜ動かない?
  • JS の node main.js と、ほとんど同じ立場。違うのは細部だけ
  • この章では「Python」の正体を、パソコンの中の実際のファイルとして見つける
  • ひらめき
  • 毎日打つことになる1行。でも「Python」とは、パソコンの中の何のことなのだろう。

一言でいうと:台本(.py)を読んで演じる役者

Python のプログラムを動かす仕組みは、台本と役者にたとえると分かりやすくなります。

たとえPythonJS(Node.js)正体
台本main.pymain.jsあなたが書いた、ただの文字のファイル
役者python3node台本を読んで、そのとおりに動くプログラム
舞台ターミナル・ファイル・ネット同じ動いた結果が現れる場所

main.py は、メモ帳で書いた文章と同じただの文字のファイルです。ダブルクリックしても何も起きません。自分で動く力は持っていないのです。

それを読んで、1行ずつ実際に演じるのが python3 という役者です。このように「プログラムの文字を読んで、その場で実行するプログラム」をインタプリタ(interpreter=通訳)と呼びます。

このたとえから、大事なことが1つ分かります。台本だけを渡しても、相手の手元に役者がいなければ劇は始まらないということです。あなたの main.py を友だちに送っても、友だちのパソコンに python3 が入っていなければ動きません。JS でも、main.js を動かすには相手のパソコンに node が入っている必要がありました。同じことです。

「役者がどこにいて、どの役者が呼ばれるのか」は、第2章のテーマになります。

  • JS から来た人の Python 01 ― Python はどこで動くのか
  • 2 / 19
  • 一言でいうと:台本(.py)を読んで演じる役者
  • 書類
  • CPU
  • ターミナル
  • main.py(台本)
  • 画面・ファイル
  • ただの文字のファイル。自分では動かない
  • 読む
  • python3(役者)
  • 台本を読んで、1行ずつ演じる
  • 演じる
  • 結果が出る
  • 台本
  • 役者(インタプリタ)
  • Python
  • main.py
  • python3
  • JS(Node.js)
  • main.js
  • node
  • ひらめき
  • main.py はただの文字の台本。それを読んで実際に動くのが、インタプリタ python3 という役者。

python3 は、ディスクの上にあるただの実行ファイル

役者 python3 の実物を見つけてみましょう。ターミナルで which python3 と打つと、「python3 と打ったときに動くファイル」の場所が表示されます。

bash
$ which python3
/opt/homebrew/bin/python3      # Homebrew で入れた Mac の例
$ which node
/opt/homebrew/bin/node

python3 と node が、同じフォルダに並んでいることがあります。どちらも「コマンドとして呼べるプログラム」として、同じ扱いを受けているということです。出てくる場所は、どうやって Python を入れたかで変わります(第2章)。

では、そのファイルはどんなものでしょうか。この本を書いた Linux の環境で見てみます。

bash
$ which python3.13
/usr/bin/python3.13
$ ls -l /usr/bin/python3.13
-rwxr-xr-x 1 root root 6507184 Feb  4  2026 /usr/bin/python3.13
$ file /usr/bin/python3.13
/usr/bin/python3.13: ELF 64-bit LSB executable, x86-64, ...
読み取れること意味
-rwxr-xr-x の x実行してよい、という印が付いている
6507184大きさは約 6.5MB
ELF ... executableLinux 用の実行ファイル(Mac なら Mach-O という形式)

つまり python3 の本体は、C 言語で書かれ、機械語に変換済みのプログラムです。あなたが書く .py ファイルとは種類が違い、パソコンの CPU が直接動かせる形になっています。役者そのものは、あらかじめ機械語で作ってあるのです。

  • JS から来た人の Python 01 ― Python はどこで動くのか
  • 3 / 19
  • python3 は、ディスクの上にあるただの実行ファイル
  • # Mac(Homebrew で入れた例)
  • # Linux(この本を書いた環境)
  • $ which python3
  • $ which python3.13
  • /opt/homebrew/bin/python3
  • /usr/bin/python3.13
  • $ which node
  • $ ls -l /usr/bin/python3.13
  • /opt/homebrew/bin/node
  • -rwxr-xr-x ... 6507184 ... python3.13
  • フォルダ
  • /opt/homebrew/bin/
  • CPU
  • 約6.5MB の実行ファイル
  • python3・node・git…が並ぶ「コマンドの置き場」
  • x(実行してよい)の印が付いた、C で書かれたプログラム
  • which は「このコマンド名を打ったら、どのファイルが動くか」を教えてくれるコマンド
  • ひらめき
  • which python3 で場所が分かる。node と同じフォルダに並んでいることも多い。特別な存在ではない。

node main.js と python3 main.py は、同じ形をしている

JS で node main.js と打つとき、実際に起きているのは「node という実行ファイルを起動し、main.js というファイルの名前を渡す」ことです。Python も全く同じ形をしています。

JSPython
打つコマンドnode main.jspython3 main.py
起動される実行ファイルnodepython3
中で動く仕組みV8(Google 製の JS エンジン)CPython(本家の Python インタプリタ)
渡されるものmain.js という文字のファイルmain.py という文字のファイル
相手のパソコンに要るものnodepython3

どちらも、あなたの書いたファイルを事前に機械語に変換して配るのではなく、実行するその場で読んで動かします。C 言語や Go のように、先に機械語の実行ファイル(.exe など)を作って、それを配るやり方とはここが違います。

この違いから、次のことが言えます。

性質理由
書いてすぐ動かせる事前のビルドが要らない。保存して python3 main.py するだけ
動かす側に python3 が要る役者は相手の手元にいなければならない
文法の間違いは実行するまで分からない読むのは実行の直前だから(第15章の道具で事前に見つけられる)

JS に慣れた人にとっては、どれも見覚えのある性質のはずです。

  • JS から来た人の Python 01 ― Python はどこで動くのか
  • 4 / 19
  • node main.js と python3 main.py は、同じ形をしている
  • JS(Node.js)
  • Python
  • $ node main.js
  • $ python3 main.py
  • CPU
  • node(実行ファイル)
  • CPU
  • python3(実行ファイル)
  • 中で V8 というエンジンが動く
  • 中身は CPython というインタプリタ
  • main.js を読み、翻訳して、実行する
  • main.py を読み、翻訳して、実行する
  • どちらも「ファイルを読んで、その場で実行する」プログラム。これをインタプリタ(通訳)と呼ぶ
  • だから、実行する側のパソコンに python3(や node)が入っていないと動かない
  • ひらめき
  • どちらも「実行ファイル」に「読ませたいファイル」を渡している。違うのは、中で動く仕組みの名前だけ。

「Python」という言葉には、3つの意味がある

普段「Python」と言うとき、実は3つの違うものを区別せずに呼んでいます。

意味中身どこにある
1 言語(ルール)if の書き方、インデント、f-string などの決まり事仕様として docs.python.org に書かれている
2 実装(CPython)そのルールどおりに .py を動かすプログラム。C 言語で書かれた本家python.org などが配っている
3 コマンド(python3)CPython を起動するための名前ディスク上の実行ファイル(前に見たもの)

「Python 3.13 で動く」と言うとき、多くの場合は「CPython 3.13 という実装で動く」という意味です。この本で「Python」と書くときも、特に断りがなければ CPython のことです。

CPython 以外にも、同じ言語のルールで動く別の実装があります。たとえば PyPy(JIT という仕組みで速く動くもの)です。ただ、ほとんどの人が使っているのは CPython で、ライブラリも CPython を前提に作られています。まずは CPython だけを考えれば十分です。

JS も同じ構造をしています。言語のルールは ECMAScript、それを動かすエンジンが V8(Chrome・Node.js)や JavaScriptCore(Safari)、起動するコマンドが node です。「JS」という一言が、この3つをまとめて指していたのと同じことが、Python でも起きています。

  • JS から来た人の Python 01 ― Python はどこで動くのか
  • 5 / 19
  • 「Python」という言葉には、3つの意味がある
  • 本
  • 言語(ルール)
  • if の書き方、インデント、f-string…の決まり。docs.python.org に書いてある
  • CPU
  • 実装(CPython)
  • そのルールどおりに動くプログラム。C 言語で書かれた本家。python.org が配る
  • ターミナル
  • コマンド(python3)
  • CPython を起動するための名前。ディスク上の実行ファイル
  • JS も同じ:言語(ECMAScript)・エンジン(V8)・コマンド(node)
  • ひらめき
  • 言語のルール・本家の実装 CPython・起動するコマンド python3。普段は区別せず呼んでいる。

実行の4段 ①:シェルが python3 という実行ファイルを探す

ここからは、python3 main.py の1行で起きることを4つの段に分けて見ていきます。舞台は図のとおりです。上の段に、ターミナル・実行ファイルの python3・あなたの main.py が並び、下の囲みが「python3 の中で起きること」です。

最初に動くのは、実は Python ではありません。ターミナルの中で、あなたの打った文字を受け取っているシェル(Mac の既定は zsh、Linux では bash が多い)です。

順番シェルがやること
1打たれた1行を、空白で python3 と main.py に分ける
21つ目の python3 を「実行するプログラムの名前」とみなす
3環境変数 PATH に並んだフォルダを、左から順に見て、python3 という名前の実行ファイルを探す
4最初に見つかったファイルを起動し、残りの main.py を引数として渡す

3番の PATH が、「どの python3 が呼ばれるか」を決めている正体です。パソコンに Python が何個も入っていても、呼ばれるのは PATH の順で最初に見つかった1つだけです。これは第2章で、実際に PATH を書き換えながら確かめます。

この段で失敗すると、zsh: command not found: python3 のようなエラーになります。これは Python のエラーではなく、シェルが「そんな名前の実行ファイルは見つからない」と言っているのです。

  • JS から来た人の Python 01 ― Python はどこで動くのか
  • 6 / 19
  • 実行の4段 ①:シェルが python3 という実行ファイルを探す
  • ターミナル
  • ターミナル
  • main.py を渡す
  • CPU
  • python3
  • 書類
  • main.py
  • $ python3 main.py
  • PATH で見つけた実行ファイル
  • あなたが書いた文字のファイル
  • python3 の中で起きること
  • 読む
  • 翻訳する
  • 実行する
  • 文字を読み、文法を確かめる
  • バイトコードに翻訳する
  • 仮想マシンが1つずつ実行
  • シェル(zsh や bash)は、PATH に並んだフォルダを左から順に探す(第2章)
  • 見つけた実行ファイルに「main.py」という文字を渡して起動する
  • ひらめき
  • 最初に動くのはシェル。PATH のフォルダを順に見て、python3 というファイルを起動する。

実行の4段 ②:python3 が main.py の文字を読む

シェルに起動された python3 は、まず渡された main.py というファイルを開いて、中の文字を読み込みます。図の小包「ソースコード」が、main.py から下の①に運ばれました。

python3 がやること詳しく
ファイルを開く今いるフォルダ(カレントディレクトリ)から見た main.py を開く
文字として読む既定では UTF-8 として読む。だから日本語の文字列もそのまま書ける
文法を確かめる括弧が閉じているか、インデントが揃っているか、などを確かめる

ここで大事なのは、文法の間違いは、この段で見つかるということです。たとえば3行目で括弧を閉じ忘れていたら、1行目の print すら実行されないうちに SyntaxError が出て止まります。「1行目は正しいのに、なぜ1行目の print も出ないのか」と不思議に思ったら、この段で止まっているのです。

逆に、文法としては正しいけれど実行してみたら困ること(存在しない名前を使った、0 で割った、など)は、ここでは見つかりません。それは④の実行の段で、その行に来たときに初めて分かります。

ファイルが見つからなければ、この段より前で can't open file というエラーになります(よくある間違いで見ます)。

  • JS から来た人の Python 01 ― Python はどこで動くのか
  • 7 / 19
  • 実行の4段 ②:python3 が main.py の文字を読む
  • ターミナル
  • ターミナル
  • CPU
  • python3
  • 書類
  • main.py
  • $ python3 main.py
  • PATH で見つけた実行ファイル
  • あなたが書いた文字のファイル
  • python3 の中で起きること
  • 文字を読む
  • 読む
  • ソースコード
  • 翻訳する
  • 実行する
  • 文字を読み、文法を確かめる
  • バイトコードに翻訳する
  • 仮想マシンが1つずつ実行
  • 文法の間違い(閉じ忘れの括弧など)は、この段で見つかる
  • だから SyntaxError は、1行も実行されないうちに出る
  • ひらめき
  • 起動した python3 は、渡された名前のファイルを開いて、文字として読み込み、文法を確かめる。

実行の4段 ③:バイトコードという命令の列に翻訳する

文法の確認が済むと、python3 はソースの文字をバイトコードに翻訳します。バイトコードとは、「値を積む」「名前に入れる」「関数を呼ぶ」といった、とても細かい命令の列です。

tenki の main.py の最初の2行は、次のような命令になります(Python 3.13 で、実際に python3 -m dis main.py で表示したもの)。

  1           LOAD_CONST               0 ('東京')
              STORE_NAME               0 (city)

  2           LOAD_CONST               1 (24)
              STORE_NAME               1 (temp)

city = "東京" の1行が、「'東京' という定数を積む(LOAD_CONST)」「それを city という名前に入れる(STORE_NAME)」の2つの命令になっています。

よくある誤解実際
Python はソースの文字を1文字ずつ解釈しながら動くまず全体をバイトコードに翻訳してから動く
バイトコードは機械語(CPU の命令)だ違う。「Python の仮想マシン」だけが分かる命令

機械語ではないので、CPU が直接実行することはできません。これを実行するのは、python3 の中にある仮想マシン(CPU のまねをするプログラム)です。これが次の段です。

  • JS から来た人の Python 01 ― Python はどこで動くのか
  • 8 / 19
  • 実行の4段 ③:バイトコードという命令の列に翻訳する
  • ターミナル
  • ターミナル
  • CPU
  • python3
  • 書類
  • main.py
  • $ python3 main.py
  • PATH で見つけた実行ファイル
  • あなたが書いた文字のファイル
  • python3 の中で起きること
  • 読む
  • 翻訳する
  • バイトコード
  • 実行する
  • 文字を読み、文法を確かめる
  • バイトコードに翻訳する
  • 仮想マシンが1つずつ実行
  • 機械語ではなく、「Python の仮想マシン用」の命令
  • LOAD_CONST '東京'
  • 右は tenki の main.py の最初の3命令
  • STORE_NAME city
  • LOAD_CONST 24
  • ひらめき
  • Python は、ソースをそのまま実行しない。まず仮想マシン用の小さな命令(バイトコード)に翻訳する。

実行の4段 ④:仮想マシンが命令を1つずつ実行する

最後の段で、CPython の中の仮想マシンが、バイトコードの命令を上から1つずつ実行します。print を呼ぶ命令のところで、ターミナルに文字が出ます。図では、ターミナルの表示が「東京:晴れ 24度」に変わりました。

起きること意味
上から順に実行命令の列を先頭から1つずつ処理する
途中でエラーが出たら止まるその命令から先は実行されない。表示されるのが Traceback(第18章)
最後まで行ったら終わるpython3 というプログラムが終了し、シェルに戻る

ここまでの4段をまとめると、こうです。

段誰が何を
①シェルPATH を見て python3 という実行ファイルを探し、起動する
②python3main.py の文字を読み、文法を確かめる
③python3バイトコードに翻訳する
④python3 の中の仮想マシンバイトコードを1つずつ実行する

JS の V8 も、内部ではソースをいったんバイトコードに翻訳しています。V8 はさらに、何度も実行される部分を見つけると、それを機械語に翻訳して速くします。これを JIT(Just-In-Time コンパイル)と呼びます。CPython は長く JIT を持っていませんでしたが、3.13 で実験的な JIT が入りました。ただし既定では使われていないので、普段は気にしなくて大丈夫です。

  • JS から来た人の Python 01 ― Python はどこで動くのか
  • 9 / 19
  • 実行の4段 ④:仮想マシンが命令を1つずつ実行する
  • ターミナル
  • ターミナル
  • CPU
  • python3
  • 書類
  • main.py
  • 東京:晴れ 24度
  • PATH で見つけた実行ファイル
  • あなたが書いた文字のファイル
  • python3 の中で起きること
  • print の結果
  • 読む
  • 翻訳する
  • 実行する
  • 実行中
  • 文字を読み、文法を確かめる
  • バイトコードに翻訳する
  • 仮想マシンが1つずつ実行
  • 1命令ずつ上から順に。エラーが出たらそこで止まる
  • JS の V8 も内部でバイトコードを作り、さらに機械語へ JIT 翻訳する
  • ひらめき
  • CPython の中の仮想マシンが、命令を順に実行する。print の命令で、ターミナルに文字が出る。

バイトコードは、自分の目で見られる

バイトコードは、見えないところで作られて消えていく秘密のものではありません。標準ライブラリの dis(disassemble=分解する)を使えば、自分の目で見られます。

tenki の天気の文を作る関数を、weather.py という別のファイルに書いたとします。

python
# weather.py
def describe(city, temp):
    return f"{city}の気温は{temp}度です"

同じフォルダで、次のように打ちます。

bash
$ python3 -c "import weather, dis; dis.dis(weather.describe)"

Python 3.13 での実際の出力はこうです。

  1           RESUME                   0

  2           LOAD_FAST                0 (city)
              FORMAT_SIMPLE
              LOAD_CONST               1 ('の気温は')
              LOAD_FAST                1 (temp)
              FORMAT_SIMPLE
              LOAD_CONST               2 ('度です')
              BUILD_STRING             4
              RETURN_VALUE

f-string の1行が、「city の値を積む(LOAD_FAST)→ 文字にする(FORMAT_SIMPLE)→ 'の気温は' を積む → temp を積んで文字にする → '度です' を積む → 4つをつなげる(BUILD_STRING)→ 返す(RETURN_VALUE)」という命令の列になっているのが読み取れます。

命令の名前や数は、Python の版によって変わります。覚える必要は全くありません。ここで持ち帰ってほしいのは、「python3 は、.py をこういう命令の列に翻訳してから動かしている」という事実だけです。これで、実行の③の段は魔法ではなくなりました。

  • JS から来た人の Python 01 ― Python はどこで動くのか
  • 10 / 19
  • バイトコードは、自分の目で見られる
  • # weather.py
  • RESUME 0
  • def describe(city, temp):
  • LOAD_FAST 0 (city)
  • return f"{city}の気温は{temp}度です"
  • FORMAT_SIMPLE
  • LOAD_CONST 1 ('の気温は')
  • $ python3 -c "import weather, dis;
  • LOAD_FAST 1 (temp)
  • dis.dis(weather.describe)"
  • FORMAT_SIMPLE
  • LOAD_CONST 2 ('度です')
  • BUILD_STRING 4
  • RETURN_VALUE
  • f-string 1行が「値を積む → 文字にする → つなげる → 返す」という9つの命令になっている
  • 命令の名前や数は Python の版で変わる。覚える必要はなく、「こういう列に翻訳される」とだけ知っておく
  • ひらめき
  • 標準ライブラリの dis を使うと、関数がどんな命令の列に翻訳されたかを表示できる。

import したファイルの翻訳結果は、__pycache__ に保存される

tenki のフォルダで main.py を実行したあと、ふとフォルダを見ると、`__pycache__` という見覚えのないフォルダができていることがあります。これは何でしょうか。

main.py から weather.py を import する形で、実際に試してみます。

python
# main.py
import weather

print(weather.describe("東京", 24))
bash
$ python3 main.py
東京の気温は24度です
$ ls -R
.:
__pycache__  main.py  weather.py

./__pycache__:
weather.cpython-313.pyc

__pycache__ の中には weather.cpython-313.pyc というファイルが1つだけあります。これが、③の段で作ったバイトコードを保存したものです。

読み取れること意味
weatherweather.py の翻訳結果
cpython-313CPython 3.13 用。版が違えば別のファイルになり、同居できる
.pycPython のバイトコード(compiled)のファイル
main の .pyc が無いコマンドラインで直接実行したファイルは、毎回翻訳し直し、保存しない

保存しておく理由は、次に import するときに翻訳を省くためです。Python は、.py の更新日時と保存済みの .pyc を比べ、.py のほうが新しければ翻訳し直します。

Python の公式のチュートリアルにもあるとおり、.pyc から読んでもプログラムの実行そのものは速くなりません。速くなるのは、読み込み(翻訳を省けるぶん)だけです。

  • JS から来た人の Python 01 ― Python はどこで動くのか
  • 11 / 19
  • import したファイルの翻訳結果は、__pycache__ に保存される
  • tenki/
  • $ python3 main.py
  • 書類
  • main.py
  • 東京の気温は24度です
  • 直接実行する。保存されない
  • $ ls -R
  • .:
  • 書類
  • weather.py
  • __pycache__ main.py weather.py
  • main.py から import される
  • ./__pycache__:
  • weather.cpython-313.pyc
  • フォルダ
  • __pycache__/
  • weather.cpython-313.pyc
  • cpython-313 は「CPython 3.13 用」の印
  • .pyc で速くなるのは読み込みだけ
  • ひらめき
  • 2回目からは翻訳を省いて速く読み込むため。直接実行した main.py は保存されない。

__pycache__ は消してよく、git には入れない

__pycache__ は、Python が自動で作り、自動で更新する使い捨ての翻訳結果です。扱い方の決まりは単純です。

やること理由
消してもよい次に import したとき、自動で作り直される
手で編集しない中身はバイトコード。ソースを直せば自動で追従する
git に入れない実行するたびに変わりうるファイルで、差分が汚れる。相手の手元でも自動でできる

git に入れないために、プロジェクトの .gitignore に次のように書いておきます。

__pycache__/
*.pyc
.venv/

3行目の .venv/ は、第12章で作る仮想環境のフォルダです。これも GitHub に上げません。GitHub で新しいリポジトリを作るときに選べる Python 用の .gitignore の雛形には、これらが最初から入っています。

どうしても .pyc を作らせたくないときは、python3 -B main.py のように -B を付けるか、環境変数 PYTHONDONTWRITEBYTECODE を設定します。ただ、普段は気にせず、.gitignore に書いておけば十分です。

JS に置き換えると、ビルドの途中でできる一時ファイルやキャッシュのフォルダのようなものです。「自分が書いたものではなく、道具が作ったもの」は、リポジトリに入れない。これは JS でも Python でも同じ原則です。

  • JS から来た人の Python 01 ― Python はどこで動くのか
  • 12 / 19
  • __pycache__ は消してよく、git には入れない
  • OK
  • 消しても、次の実行で作り直される
  • # .gitignore
  • OK
  • main.py を書き換えると自動で更新
  • __pycache__/
  • *.pyc
  • NG
  • git に入れると差分が汚れる
  • .venv/
  • NG
  • 手で編集する場所ではない
  • .venv/ も入れない(第12章)
  • GitHub の Python 用の雛形にも入っている
  • JS に置き換えると「ビルドの途中でできる一時ファイル」。node_modules/.cache のようなもの
  • ひらめき
  • ソースより古ければ自動で作り直される使い捨ての翻訳結果。.gitignore に書いておく。

ファイルなしで試す:対話モード(REPL)

ちょっとした動きを確かめたいだけなのに、毎回ファイルを作るのは面倒です。そういうときは、python3 とだけ打ちます。Python 3.13 での実際の画面はこうです。

$ python3
Python 3.13.12 (main, Feb  4 2026, 09:25:39) [GCC 13.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> city = "東京"
>>> f"{city}は晴れ"
'東京は晴れ'
>>> 1 + 2
3
>>> exit

>>> が出ている状態を、対話モードや REPL(レプル)と呼びます。REPL は Read(読む)・Eval(評価する=翻訳して実行する)・Print(表示する)・Loop(繰り返す)の頭文字です。

REPL の中でも、起きていることはファイルを実行するときと同じです。1行(または1まとまり)を読み、バイトコードに翻訳し、実行します。違うのは、式の結果の値を自動で表示してくれることです。f"{city}は晴れ" と打っただけで、print しなくても '東京は晴れ' と表示されました。引用符が付いているのは、「これは文字列の値です」という表示だからです。

Python 3.13 からは REPL が新しくなり、色付きの表示、複数行の編集、exit や help を括弧なしで打てる、などの機能が加わりました。JS で node とだけ打つと > が出て試せるのと、全く同じ使い方です。終わるときは exit と打つか、Ctrl + D を押します。

  • JS から来た人の Python 01 ― Python はどこで動くのか
  • 13 / 19
  • ファイルなしで試す:対話モード(REPL)
  • $ python3
  • 意味
  • Python 3.13.12 (main, ...) on linux
  • Type "help", "copyright", ... for more information.
  • R(Read)
  • 1行読む
  • >>> city = "東京"
  • >>> f"{city}は晴れ"
  • E(Eval)
  • 翻訳して実行する
  • '東京は晴れ'
  • >>> 1 + 2
  • P(Print)
  • 結果の値を表示
  • 3
  • L(Loop)
  • また >>> に戻る
  • >>> exit
  • node とだけ打って > が出るのと同じ
  • 3.13 から色付き・複数行編集つきの新しい REPL
  • ひらめき
  • python3 とだけ打つと >>> が出る。1行打つたびに、読む・翻訳・実行・表示を繰り返す。

python3 の渡し方は4通り

python3 という役者への台本の渡し方は、4通りあります。

打つもの何を実行するかJS でいうと
python3 main.pymain.py というファイルnode main.js
python3 -c "print(1+2)"その場で渡した1行のコードnode -e "console.log(1+2)"
python3 -m json.tool名前で探したモジュールを、スクリプトとして実行近いものは npx(探し方は違う)
python3何も渡さない。REPL になるnode

3つ目の -m は、この本で何度も出てきます。-m json.tool は「json.tool という名前のモジュールを探して実行して」という意味で、ファイルの場所は指定しません。たとえば、JSON を見やすく整形できます。

bash
$ echo '{"city":"東京","temp":24}' | python3 -m json.tool --no-ensure-ascii
{
    "city": "東京",
    "temp": 24
}

この json.tool は、Python に最初から入っている標準ライブラリの一部です。「名前で探す」の「どこを探すのか」は第8章で、python3 -m pip のように -m を付けて pip を動かす理由は第2章で説明します。

どの渡し方でも、動いているのは同じ python3 という実行ファイルです。違うのは「何を読ませるか」だけです。

  • JS から来た人の Python 01 ― Python はどこで動くのか
  • 14 / 19
  • python3 の渡し方は4通り
  • 打つもの
  • 何を実行するか
  • JS でいうと
  • python3 main.py
  • main.py というファイル
  • node main.js
  • python3 -c "print(1+2)"
  • その場の1行のコード
  • node -e "..."
  • python3 -m json.tool
  • 名前で探したモジュール(第2章)
  • npx に近い(探し方は違う)
  • python3
  • 何も渡さない → REPL
  • node
  • -m は「ファイルの場所ではなく、モジュールの名前で指定する」。詳しくは第2章
  • python3 --version で版、python3 -h で全部のオプションが見られる
  • ひらめき
  • ファイル・1行のコード・モジュール名・何も渡さない(REPL)。どれも同じ python3 が動いている。

ブラウザの中では、Python は動かない

JS を書いてきた人がよく抱く疑問に、「HTML に <script> で .py を書けないの?」というものがあります。答えは、そのままでは動きません。

理由は、役者のたとえで説明できます。

JSPython
ブラウザに最初から入っている役者JS エンジン(Chrome なら V8、Safari なら JavaScriptCore)いない
<script> に書いたらその場で動く読める役者がいないので動かない
動かせる場所ブラウザ・Node.jspython3 を入れたパソコン・サーバー

JS は「ブラウザに最初から役者がいる」言語です。だから Web ページの中で動かせます。Python は「役者を自分で連れてくる」言語で、ブラウザには役者がいません。

例外として、Pyodide というプロジェクトがあります。CPython そのものを WebAssembly(ブラウザで動く機械語のような形式)に変換し、Web ページと一緒にダウンロードさせて動かすものです。つまり「役者ごとページに持ち込む」方法です。面白い技術ですが、読み込むものが大きく、普段の Web 開発で使うものではありません。

Web で Python を使うときの普通の形は、Python はサーバーの上で動かし、ブラウザには結果(HTML や JSON)だけを送るというものです。ブラウザの側は、届いた結果を JS で表示します。tenki でも、第17章で FastAPI を使って、まさにこの形を作ります。

  • JS から来た人の Python 01 ― Python はどこで動くのか
  • 15 / 19
  • ブラウザの中では、Python は動かない
  • ブラウザ(Chrome・Safari…)
  • パソコン・サーバー
  • 電気
  • JS エンジン(V8 など)
  • CPU
  • python3
  • 最初から入っている → <script> が動く
  • あなたが入れた。ここで .py が動く
  • NG
  • Python のインタプリタ
  • パズル
  • 例外:Pyodide
  • 入っていない → .py は動かない
  • CPython を WebAssembly にして、ページごと持ち込む
  • JS は「ブラウザに最初から役者がいる」言語。Python は「役者を自分で連れてくる」言語
  • Web で Python を使うときは、サーバーで動かして、結果(HTML や JSON)だけをブラウザに送る(第17章)
  • ひらめき
  • ブラウザに入っているのは JS のエンジンだけ。Python のインタプリタは入っていない。

Python が動くのは、python3 が入っている場所だけ

ここまでをまとめると、Python のプログラムが動くのは、python3 という実行ファイルが入っている場所だけです。

場所tenki での使い道そこにある python3
あなたのパソコンtenki を書いて試すあなたが入れたもの(第2章)
サーバーtenki の Web API を動かす(第17章)サーバーに入れたもの
CI の機械GitHub Actions でテストを自動で回すその機械に毎回用意するもの

どの場所でも、最初に確かめるべきことは同じです。「この場所には、どの python3 が、どこに入っているか」。

これが意外とややこしいのです。1台のパソコンに、最初から入っていた Python、自分で入れた Python、道具が入れた Python が同居していることは珍しくありません。どれが呼ばれるかによって、版も、使えるライブラリも変わります。

さらに、.py ファイルだけを別の場所に運んでも、そこに同じライブラリが入っていなければ動きません。そのため、コードと一緒に「必要なライブラリの一覧」を運び、その場で入れ直すことになります(第13章)。

まずは足元から。次の第2章で、自分のパソコンに入っている python3 を全部見つけ、どれが呼ばれるのかを確かめます。

  • JS から来た人の Python 01 ― Python はどこで動くのか
  • 16 / 19
  • Python が動くのは、python3 が入っている場所だけ
  • ノートPC
  • あなたのパソコン
  • サーバー
  • サーバー
  • 更新
  • CI の機械
  • tenki を作って試す
  • Web API を動かす(第17章)
  • GitHub Actions でテスト
  • CPU
  • CPU
  • CPU
  • ここにも python3 が要る
  • ここにも python3 が要る
  • ここにも python3 が要る
  • どの場所でも、まず「どの python3 が、どこに入っているか」を確かめる。それが第2章のテーマ
  • そして .py と一緒に「必要なライブラリの一覧」を運び、その場で入れ直す(第13章)
  • ひらめき
  • パソコン・サーバー・CI の機械。どこでも「そこに python3 があるか」が出発点。

よくある間違い:3つのエラーは、どの段で止まったか

最初のうちに出会うエラーの多くは、実行の4段のどこで止まったかを考えると、すぐに原因が分かります。

エラーの文面止まった段原因と直し方
zsh: command not found: python① シェルPATH のどこにも python という実行ファイルが無い。Mac では python3 と打つ(第2章)
python3: can't open file '/Users/you/main.py': [Errno 2] No such file or directory② ファイルを開くpython3 は起動したが、今いるフォルダに main.py が無い。cd tenki で移動するか、パスを正しく書く
>>> python3 main.py のあとに SyntaxError: invalid syntax② 文法の確認REPL の中に、シェルのコマンドを打ってしまった。exit で REPL を出てから打つ

1つ目は、実は Python のエラーではありません。zsh: で始まっているとおり、シェルが出しています。Python はまだ起動すらしていません。

2つ目は、Python は起動したけれど、渡されたファイルを開けなかったというエラーです。python3 は、今いるフォルダ(カレントディレクトリ)を基準に main.py を探します。pwd で今いる場所を、ls でそこにあるファイルを確かめましょう。

3つ目は、REPL の >>> の後ろは「Python のコードを書く場所」なのに、シェルのコマンドを書いてしまったケースです。Python から見ると python3 main.py は、名前が2つ空白で並んでいるだけの、意味の通らない文です。

エラーの文面を「どの段の誰が言っているのか」で読めるようになると、慌てずに済みます。

  • JS から来た人の Python 01 ― Python はどこで動くのか
  • 17 / 19
  • よくある間違い:3つのエラーは、どの段で止まったか
  • zsh: command not found: python
  • ① シェルが python を見つけられない
  • Mac では python3 と打つ(第2章)
  • python3: can't open file '.../main.py': [Errno 2] No such file or directory
  • ② main.py が今のフォルダに無い
  • cd でフォルダを移動するか、パスで指定
  • >>> python3 main.py → SyntaxError: invalid syntax
  • ② REPL にシェルのコマンドを打った
  • exit で REPL を出てから打つ
  • 頭に zsh: とあればシェルが、python3: とあれば Python が言っている
  • ひらめき
  • エラーの文面は、4段のどこで止まったかを教えてくれる。シェルか、ファイルを開く段か、読む段か。

tenki の第一歩:1ファイルを書いて動かす

では、tenki の最初の版を作りましょう。

bash
$ mkdir tenki
$ cd tenki

tenki フォルダの中に、エディタで main.py を作り、次の3行を書きます。

python
# main.py
city = "東京"
temp = 24
print(f"{city}:晴れ {temp}度")

保存したら、実行します。

bash
$ python3 main.py
東京:晴れ 24度

これで、tenki の第1版は完成です。フォルダの中はこうなっています。

/Users/you/tenki/
└── main.py

使ったものを確かめておきます。

書いたもの意味JS でいうと
# main.pyコメント。# から行末まで// main.py
city = "東京"変数に文字列を入れるconst city = "東京";
f"{city}:..."f-string。{} の中に値を埋め込むテンプレート文字列 ` ${city}:... `
print(...)画面に表示する組み込み関数console.log(...)

print は、import しなくても最初から使える組み込み関数です。この「最初から使える名前」と、「import しないと使えない名前」の違いも、第8章で仕組みから見ます。

文法の細かい話は第3章で JS と並べて説明するので、今は「書いて、python3 main.py で動いた」ことだけで十分です。

  • JS から来た人の Python 01 ― Python はどこで動くのか
  • 18 / 19
  • tenki の第一歩:1ファイルを書いて動かす
  • $ mkdir tenki && cd tenki
  • # main.py
  • $ (エディタで main.py を作る)
  • city = "東京"
  • $ python3 main.py
  • temp = 24
  • 東京:晴れ 24度
  • print(f"{city}:晴れ {temp}度")
  • /Users/you/tenki/
  • print は最初から入っている関数
  • 書類
  • main.py
  • 中身は上の4行だけ
  • ファイルはこれ1つ
  • (組み込み関数)。import は不要
  • f"{city}" は JS のテンプレート文字列
  • `${city}` と同じ(第3章)
  • ひらめき
  • フォルダを作り、main.py を置いて、python3 で実行する。これだけで tenki が動く。

まとめ:Python は「python3 というプログラムが .py を読んで動かす」

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

項目内容
python3 の正体ディスク上の実行ファイル。中身は CPython というインタプリタ。which python3 で場所が分かる
node との関係同じ立場。どちらも「文字のファイルを読んで、その場で動かす」プログラム
実行の4段① シェルが PATH で探す → ② 読んで文法を確かめる → ③ バイトコードに翻訳 → ④ 仮想マシンが実行
バイトコードPython の仮想マシン用の命令の列。dis で見られる
__pycache__import したファイルのバイトコードの保存場所。消してよい・git に入れない
REPLpython3 とだけ打つ。1行ずつ読んで、実行して、値を表示する
ブラウザPython の役者はいない。サーバーで動かし、結果だけを送る

ところで、この章の中で気になる出力がありました。Mac の例では /opt/homebrew/bin/python3、Linux の例では /usr/bin/python3.13。人によって python3 の場所が違います。版も、人によって 3.13 だったり 3.12 だったりします。Mac で python と打つと command not found になるのに、python3 だと動くのはなぜでしょうか。

そもそもこの python3 は、誰が、どこに入れたものなのか。何個も入っていたら、どれが呼ばれるのか。次の第2章では、Python の入れ方と、PATH が「どの python3 が呼ばれるか」を決める仕組みを見ます。

  • JS から来た人の Python 01 ― Python はどこで動くのか
  • 19 / 19
  • まとめ:Python は「python3 というプログラムが .py を読んで動かす」
  • 項目
  • この章で見たこと
  • python3 の正体
  • ディスク上の実行ファイル(CPython)。which python3 で場所が分かる
  • python3 main.py
  • シェルが探す → 読む → バイトコードに翻訳 → 仮想マシンが実行
  • __pycache__
  • import したファイルの翻訳結果。消してよい・git に入れない
  • REPL
  • python3 とだけ打つ。1行ずつ読んで・実行して・表示する
  • ブラウザ
  • Python のインタプリタは入っていない。サーバーで動かす
  • JS との関係
  • node main.js と同じ立場。インタプリタが .py を読んで動かす
  • ひらめき
  • では、その python3 は誰がどこに入れたのか。人によって版が違うのはなぜか。次の第2章で見る。

0 件のコメント

読み込み中…

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