WindowsOSのアプリケーション実行時の動きとPythonスクリプトを実行したときのOS(ターミナル)の振る舞いについて説明する。また、ディレクトリとパスについても述べる。
1. アプリケーションの実行とターミナル
エクセルなどのnativeアプリはxlsxの拡張子を持つファイルをダブルクリックすると開いて、エクセルのアプリケーション上で編集できるようにすることができる。このときOS上ではなにが起きているか?それを表したのが下記の図である。この図はエクセルを例に説明したものだが、一般化すると下記のステップでアプリケーションは動作する。
- ファイルをダブルクリックする。
- ファイルの拡張子がOSにチェックされる。
- 既定のアプリ上で設定された拡張子に紐づくnativeのアプリケーションが選択される。
- 3で選択されたアプリまでのフルパスがターミナルに入力される。
- 続けてターミナル上に同ファイルのフルパスが第1引数として入力され、アプリケーションが実行される。
※引数とは…
引数(ひきすう/argument/parameter)は、数学の関数を例に考えてみるとわかりやすい。y=f(x)のような関数を見たことがあるだろうが、yという変数の値は、xの値が決まらないと、定まらない。このようにある値を引き渡さないと関数の状態が定まらないようなパラメータのことを引数という。y=f(a,b)というような関数が存在するのと同じように、引数は2つ以上とれる場合もある。なお、引数はプログラミング界隈の用語であり、数学の用語ではないことに留意されたい。
ここでターミナルの入力順序に気を付ける必要がある。入力順序を誤ると動作しない。
入力順序は、中学英文法で見たことがあるであろう SVO の文型をイメージすると良い。Cから始まるファイルパスが主語S、続いてアプリケーションのフルパスが動詞V、アプリケーションで動かしたいもの・見たいもの・編集したいものなどが目的語Oである。このアナロジーの通り、アプリケーションは動作するもの(V)であり、それは多くの場合、対象となるファイル(O)がある。そしてそれらを実行するのは、OS(S)である。なお、主語Sには、Command Prompt の他に、PowerShell がある。※この2つのターミナルは互換性がないと言って良い。
※シェル・ターミナル・コンソールなど似た概念についてよくまとめられた記事▼
/https://eng-entrance.com/linux-basic-shell-terminal-console
2. Pythonの開発環境とPythonスクリプトが実行できる仕組み
プログラミングをやっている人はVScodeを利用して開発している人も多いだろう。特に昨今は猫も杓子もPythonでものを作っている人も多い。Pythonの環境はAnacondaが有名で利用者も多いが、商用利用は有償となったことで、WinPythonに乗り換える人もいる。どちらも結局は同じpython.exeを利用しているので実行結果は同じとなる(実行時間は異なる場合がある)。そしてどちらの環境でもVScodeで、正確にはターミナルでpythonを実行する際の手順でwindowsの環境変数をいじるという工程を踏む必要があったはずである。環境構築について紹介しているサイトは概ね同じことが書いてあるが、なぜ環境変数をいじる必要があるかは書いていないことが多いので、環境構築手順で何をしたか、pythonスクリプトはどのように実行されるか、ということを図にすると下記のようなイメージとなる。このイメージは下記の1-10のステップで実行される。
- WinPythonをインストール
- Visual Studio Codeをインストール
- WinPythonのインストールフォルダ直下のscriptsフォルダのフルパスを環境変数のPathに格納
- VScodeでコーディングすることでpythonスクリプトファイル(pyファイル)を作成する
- VScode内の▶ボタン(実行ボタン)をクリックする
- VScode内に埋め込まれたターミナルに自動入力で下記のような文字列が投げ込まれ、Enterを自動で押下される
C:\***>python *****.py - 1章ではフルパスでアプリケーションが実行されていたが、設定した環境変数のPathの値によって、そのパスの先にあるバッチファイル(拡張子がbatのもの)が実行され、python.exeまでのパスを自動補完してくれるため、pythonしか入力されない。
- そして実行ボタンを押したときに開いてアクティブになっているファイルが相対パスでターミナルに引数として渡される。
※相対パスとは…
- その後、python.exeがWinPython内の色々なファイルと引数のスクリプトとを処理して、ゼロ・イチに変換される。
- ゼロ・イチに変換されたデータは最終的に画面のピクセルの色を変えたり、周辺機器と通信したりして、書かれたコードの通りに動作する。