PYTHON環境構築するなら絶対に理解しておかないといけない注意点

#インストール形式は3種類ある

普段みなさんがpythonの開発環境を構築するためには下記の公式ページからインストーラーをダウンロードすることでしょう。
***Python Releases for Windows***
https://www.python.org/downloads/windows/

例えば2020年1月21日付ではpython3.8.1が下記の形式で配布されている
※webの内容をコピペ

- Download Windows help file
- Download Windows x86-64 embeddable zip file
- Download Windows x86-64 executable installer
- Download Windows x86-64 web-based installer
- Download Windows x86 embeddable zip file
- Download Windows x86 executable installer
- Download Windows x86 web-based installer

上から順番に説明すると

- 説明書(help)
- 64bit版***組込み用***zipファイル
- 64bit版インストーラー
- 64bit版webインストーラー
- 32bit版***組込み用***zipファイル
- 32bit版インストーラー
- 32bit版webインストーラー

になります。
基本的に個人の勉強目的などではどちらかのインストーラ(～installer)を使用するのではないでしょうか？

それぞれの詳細について細かく説明します。
なお、Download Windows help file及び、Download Windows x86～については説明しません。(趣旨から外れるのと説明しなくても意味わかるでしょう？)
※また、本記事の趣旨の為、順番を変えて説明させていただきます。

##Download Windows x86-64 executable installer
最もオーソドックスなインストーラ。
インストーラ形式のファイルであり、インストーラ自体に全ファイルが含まれている為、ネット環境が無くてもインストールが可能です。
また、設定により特定のユーザだけが使用できるようにするのか、環境変数にpythonのパスを登録するするのか、py.exe(詳細は後述)もインストールするのか等細かく環境を設定できます。
***理由がない、又は初心者又はpythonのマニュアルを全部読む気がないのであればこの形式でのインストールを強くおすすめします。***

##Download Windows x86-64 web-based installer
Download Windows x86-64 executable installerのwebインストーラ版です。
webインストーラというのは簡単に言うとインストール時のファイルを***ネットワーク経由***でインストールする形式であり、インストーラ自体は非常に軽量です。
インストールにネットワーク接続された環境が必須ということを除けば通常のインストーラと変わりません。
visualstudioやrockstarゲームランチャーのような***ウンGB***のインストールが必要なものでよく使われています。

##Download Windows x86-64 embeddable zip file
***問題児。***
意訳すれば組込み形式配布ファイルになります。これはインストーラを介さずにzipファイル内にpythonの起動に必要な(***最低限の***)構成(***+αの超特殊な設定ファイル***)が含まれており、解凍すればスグに使用できるスグレモノとなっています。
***もちろんその代償が存在しますが。***

***そのうえ、pipも無い漢らしい仕様です。(pipを使いたい場合、一通り環境構築完了後pipを構成するプログラムを通す必要があります)***

##embeddable zip fileの代償とは？
この記事の本題となります。
この配布形式では含有ファイルに他のインストーラにはないファイルが存在します。
そのファイルは***python〇〇.__pth (〇にはpythonのバージョンが記載)***です。pythonのマニュアルを隅々まで読まない悪い子にはこいつが牙を剥きます。

pythonではコマンドライン引数にファイルを指定して呼び出した場合、
(python C:\～～\main.py のようなコマンド)sys.path[0]にコマンドライン引数に指定したファイルのディレクトリパスをモジュール参照先設定として追加するという挙動があり、これは公式ドキュメントに記載がされています。
[https://docs.python.org/ja/3/library/sys.html?highlight=sys%20path]

これにより、プログラム中で同じディレクトリ下にある別のpyファイルのモジュールを読み出すことが出来ます。
下記は自環境でのsys.path[0]の例です。

```console
['(コマンドライン引数に渡したpyファイルディレクトリのフルパス)',
 'C:\\(pythonインストールディレクトリ)\\python37.zip',
 'C:\\(pythonインストールディレクトリ)\\DLLs',
 'C:\\(pythonインストールディレクトリ)\\lib',
 'C:\\(pythonインストールディレクトリ)',
 'C:\\Users\\(ユーザー名)\\AppData\\Roaming\\Python\\Pytho
 'C:\\(pythonインストールディレクトリ)\\lib\\site-packages',
 'C:\\(pythonインストールディレクトリ)\\lib\\site-packages\\win32',
 'C:\\(pythonインストールディレクトリ)\\lib\\site-packages\\win32\\li
 'C:\\(pythonインストールディレクトリ)\\lib\\site-packages\\Pythonwin
 '(コマンドライン引数に渡したpyファイルディレクトリのフルパス)']
```
公式ドキュメントどおりですね。

ですが、embeddable zip fileでは下記のようになります。

```console
 ['C:\\(pythonインストールディレクトリ)\\python37.zip',
 'C:\\(pythonインストールディレクトリ)',
 'C:\\(pythonインストールディレクトリ)\\lib\\site-packages'] ※pip構成したので追加されている
```

###?????
参照しているpathがあからさまに不足してますね。
インストーラ版ではその記載通りに動くのですが、***embeddable zip fileではコマンドライン引数に指定したファイルのディレクトリをモジュール参照パスに指定してません。***
それ以外も参照パスが違いますね。
この挙動については
[https://docs.python.org/ja/3/using/windows.html]
上記マニュアルの(3.8. モジュールの検索)にその挙動について説明があります。

embeddable zip fileでは***[python〇〇._pth]があると隔離モードでの起動になるため全て自分でモジュール参照設定を明記する必要があります。***

隔離ですよ。隔離。村八分モードです。

これの対応方法としては、

- ①ソースコードに参照するモジュールのパスを一つ一つ設定する
- ②python.exeの含まれたディレクトリに[適当な名前.pth]を作成し、その中にpython.exeを起動した際に必ず参照させたいディレクトリパスを記述する
- ③python〇〇.__pthファイルを削除する(隔離モードの解除)

等がありますが、それぞれデメリットもあります。

- ①であれば自身のソースがどのモジュールを参照するか全て把握し、網羅して記載する必要があります(pipしたパッケージ、自作モジュール等)
- ②であれば小さなpythonプログラムが増える度、いちいちpthファイルに記載する必要がある上、同名のファイル、変数名が存在する場合多重定義エラーが発生します。
- ③を削除した場合はインストーラ版と同じ挙動をしますが、細かい設定ができなくなります。(embeddable zip file使う時点で細かい設定をすると言う前提になるのでそれなら最初からインストーラを使用するべきです。)

それ以外にもインストーラ版との違いとしては

- py.exeが含まれない

というのがあります。
py.exeはpythonランチャーと呼ばれており、複数のpythonバージョンを管理し、ソースコードに合わせて適切なバージョンを起動してくれるものになります。(新バージョンを試す目的で複数バージョンをインストールするとき等に効果を発揮します。)

インストーラ版ではインストール時に特殊な設定をしないとpythonインストール先がユーザー固有のディレクトリ(WindowsならAppData以下)にしかインストール出来ませんが、それはセキュリティ問題に対応する理由があります。
(全ユーザーがアクセス出来る様なディレクトリにpython.exeをインストールした場合、悪意あるスクリプトファイルやスクリプトを実行できる為)

embeddable zip file ではその制約がかからず、好きな場所に設置できるため、それらも踏まえて全部自身で管理できる場合にだけ使用してください。

pythonではインストーラが複数存在しますが、含まれているものの違い、挙動の違いも把握しないといけません。(pythonに限りませんが)

##じゃあ、embeddable zip fileはどういうときに使うの？
結論から言いますと、python環境のない端末に自身が作成したものを配布する際などに使用します。(サーバー等のバックエンドに設置したり・・・)また、pythonのバージョンを更新しない(配布したらpython.exe自体のアップデートは行わない)を前提にする必要があります。
たとえ、pythonの更新が必要になったとしてもpy.exeが無いのでバージョン管理も自身が対応する必要があります。

#最後に
pythonに限りませんが、インストール形式が複数存在するものと言うのは
***それなりに理由があるから複数存在するのです。***
過去の経験とか、他のアプリのインストール形式に似ているからと確認せずに使うと
***必ず手痛いしっぺ返しにあいます。***