忘れたころに使うWindowsPython環境確認・実行手順

# 
## はじめに

### 背景と内容

WindowsマシンでPythonを使ったことはあるけども、利用頻度が少なかったり複数端末持っていたりするとどういうpython環境だったのか忘れがち。環境や仮想環境の復習から入って手間取り、仮想環境を起動したりrequirementsに時間がかかるのは結構ストレス。そうした場合に向けた環境確認や仮想環境作業の個人的備忘メモ・雑記メモ。

構築済みのpython, pip, venv環境を思い出して歩き出すための初歩的な手順について一覧化しただけです。イチからのpython環境構築やvenvの説明等はしません（『参照』のサイトを見れば丁寧に書いてあると思います）。

### 前提（以降のコマンド結果はすべてこの前提に基づいた内容です）

Windowsで[python.org](https://www.python.org/downloads/windows/)のインストーラでインストール済み、コーディングや実行実績がある方を想定します。AnacondaやMicrosoftストア経由でインストールされた方は勝手が違う場合があるかもしれません。

当方の環境はWindows10でPython3.9, 3.12をインストールしています。**3.9のみWindows上でpathを通して"python"コマンドとして実行できる**ようにしています。3.12は直近で入れてpathも通していません。以降の手順でも3.9と3.12の両者を確認しつつですがバージョン数自体には特に深い意味や違いはありません。また、Powershellで実行しています。

当然といえば当然ですがインストールしていないバージョンはコマンドで指定しても使えません。version3.12を入れたからといって3.1~11も使えるようになるかというとそんなことは無いです。

### 参照

大体はこの辺に丁寧に書いてあります。

- [Python環境構築ガイドWindows](https://www.python.jp/install/windows/index.html)

- [Windows で Python を使ってみる (初心者向け)](https://learn.microsoft.com/ja-jp/windows/python/beginners)

- [Python におけるパッケージングに関する概要](https://packaging.python.org/ja/latest/overview/)

## 環境の確認

python本体やpipについて現在のマシン環境の確認手順を書き連ねます。

:::note warn
以降の作業はPowershellで実行しています
:::

### pythonの確認

- pythonランチャー（py.exe）でのインストールされたpython一覧の確認
pythonランチャーが使えるならWindows上にインストールされた各バージョンのリストを出力できます。
```powershell
PS D:\work\python3\projects> py --list
 -V:3.12 *        Python 3.12 (64-bit)
 -V:3.9           Python 3.9 (64-bit)
```

- 通常のpythonのバージョン確認
単純にバージョン指定せずに打った時に実行されるデフォルトバージョンは--versionで確認できます。また、複数バージョンインストールしているときは特定のバージョンを引数で明示的に指定してそちらで動作・マイナーバージョンまでの確認ができます、

```powershell
PS D:\work\python3\projects> py --version
Python 3.12.6
PS D:\work\python3\projects> py -3.9 --version
Python 3.9.5
```

- pathを通したpythonのバージョン確認
Windowsの環境変数PathにPythonのフォルダを通している場合、その指定フォルダ配下のバージョンで実行されるということになります。以下の場合、古い3.9.5だけpathを通していたので"python"で実行すると3.12ではなく3.9のバージョンで実行されていることがわかります。

```powershell
PS D:\work\python3\projects> python --version
Python 3.9.5
```

:::note info
[補足]windows側で通したpath設定の確認

1. [Winキー]+Rに'sysdm.cpl'を入力し「システムのプロパティ」を起動
1. 「詳細設定」タブの「環境変数」を選択
1. 「Path」をダブルクリックして編集窓を起動
1. pythonがインストールされたフォルダのpathの有無を確認
:::

- pythonのソースフォルダ
Pythonの実行ファイルおよびLibs,Scriptsフォルダのある場所も意外と参照したくなります。pyランチャーが使えるなら実行ファイルのリストを出力できます。

```powershell
PS D:\work\python3\projects> py --list-paths
 -V:3.12 *        C:\Users\USERNAME\AppData\Local\Programs\Python\Python312\python.exe
 -V:3.9           C:\Users\USERNAME\AppData\Local\Programs\Python\Python39\python.exe
```

個別にpythonのPathを通した場所を知りたいのならば前述のpathの環境変数を見に行くか、pythonのsys.executableで逆引きできます。以下では古いv3.9だけpathを通していたので、3.9の実行フォルダの場所が参照できます。

```powershell
PS D:\work\python3\projects> python
>>> import sys
>>> sys.executable
'C:\\Users\\USERNAME\\AppData\\Local\\Programs\\Python\\Python39\\python.exe'
```

### pipの確認

- pythonのバージョンを指定してpip

複数pythonバージョンがあるとそれぞれで別々にpipでインストールした外部ライブラリの管理がされています。どのバージョンで何がインストールされているのか明確にしないと後から大混乱を引き起こします（自環境のlatestも後々変わったりしますし）。
以下はlistですがinstallも同様のコマンドでバージョン指定できます。

```powershell
PS D:\work\python3\projects> py -3.9 -m pip list
Package    Version
---------- -------
pip        21.1.1
setuptools 56.0.0

PS D:\work\python3\projects> py -3.12 -m pip list
Package Version
------- -------
pip     24.2
```

### venvの確認

venvで過去に作成したことのある仮想環境の一覧をコマンドの機能として取得する方法は現時点では無いようです。どうしても探している仮想環境があればvenvを用いて作成した仮想環境のキーワードで確認する方法をとりましょう。

ある程度開発やプロジェクトのフォルダが切られていれば、そこで".venv"というフォルダ名で探したり、"activate"のスクリプト名で探せば過去の仮想環境フォルダがヒットするかもしれません。

- Powershellで".venv"フォルダの検索

```powershell
PS D:\work\python3\projects> Get-ChildItem -Path "./" -Recurse -Directory -Filter ".venv"
    ディレクトリ: D:\work\python3\projects\venv_py39
Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----        2024/09/27     10:35                .venv
    ディレクトリ: D:\work\python3\projects\venv_test
Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----        2024/09/27     10:07                .venv
```

- Powershellで"activate"ファイルの検索

```powershell
PS D:\work\python3\projects> Get-ChildItem -Path "./" -Recurse -File -Filter "activate" 
    ディレクトリ: D:\work\python3\projects\venv_py39\.venv\Scripts
Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        2024/09/27     10:35           1986 activate
    ディレクトリ: D:\work\python3\projects\venv_test\.venv\Scripts
Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        2024/09/27     10:07           2074 activate
```


## Pythonの実行手順

### バージョン指定して実行

シンプルにWindows上でpyランチャーで実行すると基本はマシンでlatestのバージョンで実行されますが、バージョン指定すればそのバージョンで起動します。当然ですがWindows上でインストールしていないバージョンを指定しても使えません。

```powershell
PS D:\work\python3\projects> py
Python 3.12.6 ...
>>>

PS D:\work\python3\projects> py -3.9
Python 3.9.5 ...
>>>

PS D:\work\python3\projects> py -3.9 .\hello.py
Hello, World
3.9.5 (tags/v3.9.5:0a7dcbd, May  3 2021, 17:27:52) [MSC v.1928 64 bit (AMD64)]
```

### 新規の仮想環境を構築する

[参考：仮想環境を構築し使用する](https://packaging.python.org/ja/latest/guides/installing-using-pip-and-virtual-environments/#create-and-use-virtual-environments)

次に新規に開発フォルダ・仮想環境を切ってもろもろ実行するサンプル手順を書きます。
venv_testという開発のルートフォルダを作成した場合、このルート直下で仮想環境作成コマンドを打ちます。

```powershell
PS D:\work\python3\projects> mkdir venv_test
PS D:\work\python3\projects> cd .\venv_test\
PS D:\work\python3\projects\venv_test> py -m venv .venv
```

:::note info
仮想環境の資材を置くフォルダの名前指定は".venv"でなくてもよいのですが、通常はメタ的な隠しフォルダとして扱ったりgitignoreでgitへ上げないようにしたりするため、この名前を標準にしたほうが良いようです。
:::

### 仮想環境を起動する

- 初めて起動する場合

仮想環境を利用する前に、PowerShellで仮想環境起動のスクリプトの実行を許可しておきます。PowerShellを起動し、次のコマンドを実行します。これによりローカルのスクリプトを現在のユーザが実行できるようになります。

```powershell
PS D:\work\python3\projects> Set-ExecutionPolicy RemoteSigned -Scope CurrentUser -Force
```

:::note warn
このコマンドは、一番最初に一回だけでOK。2回目以降は不要です。
:::

- 仮想環境の起動と終了

.venvフォルダ下のactivateするコマンドを打ち、仮想環境を起動します。するとコマンド プロンプトの先頭に (.venv)と表示され、仮想環境内で操作している状態になります。

終了する場合はdeactivateと入力すればOKです。
また、再度同じ仮想環境を起動したければ同じ手順のactivateでOKです。

```powershell
PS D:\work\python3\projects\venv_test> .\.venv\Scripts\activate
(.venv) PS D:\work\python3\projects\venv_test> py -V
Python 3.12.6

(.venv) PS D:\work\python3\projects\venv_py39\.venv\Scripts> deactivate
```

Pythonのバージョンを指定してそのバージョンで動作する仮想環境を作ることもできます。

### 仮想環境ライブラリの構築

まずpipを最新化しておきます。

```powershell
(.venv) PS D:\work\python3\projects\venv_test> py -m pip install --upgrade pip
```

次に、一例として仮想環境で"request"ライブラリをインストールしてみます。すると、仮想環境配下のLibフォルダに依存も含め格納されているのがわかります。

```powershell
(.venv) PS D:\work\python3\projects\venv_test> py -m pip install requests
...
Successfully installed certifi-2024.8.30 charset-normalizer-3.3.2 idna-3.10 requests-2.32.3 urllib3-2.2.3

(.venv) PS D:\work\python3\projects\venv_test\.venv\Lib\site-packages> ls -directory -name
certifi
certifi-2024.8.30.dist-info
charset_normalizer
charset_normalizer-3.3.2.dist-info
idna
idna-3.10.dist-info
pip
pip-24.2.dist-info
requests
requests-2.32.3.dist-info
urllib3
urllib3-2.2.3.dist-info
```

これらのインストールしたモジュールは仮想環境内でのみ有効で、元のWindowsインストールフォルダのPythonや他の仮想環境から直接利用することはできません。

### 環境の移行（requirements.txtの利用）

このライブラリを他の環境に移行し同じ前提状態を構築するには、requirements.txtを使います。例えばこの環境で何かpythonプログラムが開発され動作が確認されたとして、別環境になったとしても同じライブラリを過不足なく用意すれば動くはずです。

:::note info 
【どうでもいい補足】正確には「ライブラリをはじめとするプログラム実行に必要な入力要素すべて揃えたら動くはず」ですが、ここでは単純にライブラリをimportしてモジュールを実行するだけのpythonプログラムの話とします。
:::

- ライブラリ一覧の出力

**pip freeze** コマンドを使うことで、インストール済みの全パッケージのバージョン付きのリストをテキスト形式で取り出すことができます。この情報を"**requirements.txt**"というファイルに出力することで環境の読み書きを容易にします。

```powershell
(.venv) PS D:\work\python3\projects\venv_test> python -m pip freeze
certifi==2024.8.30
charset-normalizer==3.3.2
idna==3.10
requests==2.32.3
setuptools==75.1.0
urllib3==2.2.3
wheel==0.44.0

(.venv) PS D:\work\python3\projects\venv_test> python -m pip freeze > requirements.txt
```

- ライブラリの移行

出力したrequirements.txtを別のまっさらな仮想環境にコピーします。pipのrequirements用のコマンドを打つことでその内容が自動ですべてインストールされます。これにより新規環境でも他のpythonプログラムの実行環境を迅速に整えることができます。

```powershell
PS D:\work\python3\projects\venv_py39> py -m pip install --upgrade pip
PS D:\work\python3\projects\venv_py39> py -m pip list
Package Version
------- -------
pip     24.2

PS D:\work\python3\projects\venv_py39> py -m pip install -r requirements.txt
...

PS D:\work\python3\projects\venv_py39> py -m pip list
Package            Version
------------------ ---------
certifi            2024.8.30
charset-normalizer 3.3.2
idna               3.10
pip                24.2
requests           2.32.3
setuptools         75.1.0
urllib3            2.2.3
wheel              0.44.0
```