環境を全く汚さず、環境再現性が取れる、おそらく唯一の Pyhonの環境構築法

# 概要
・**①環境を汚さない、②環境再現性が取れる**、Pyhonの環境を構築(win版)
・**たぶん現状、環境を全く汚さず、環境再現性が取れる唯一の方法**
・Embeddable Python + Poetryで環境を構築（パスを通さない

# 背景
Pythonでおなじみのrequrememt.txtには再現性は保証されていない（と思う
たぶんrequrememt.txt出して、再構築したらコンフリクトする人は多いと思う。
私はコンフリクトして再構築不可能になった（２敗。

参考

https://qiita.com/yamadax/items/fa07028a534de1f13a6e

### 対抗手段
対抗手段として最近では、Poetryだのryeだのuvが登場している。
おかげで環境再現性は担保されるようになってきたが、
PATHを通したくないシーンがあった時、ご面倒（工場のPCなど

一方で、Winpythonなどを使えばPortableな環境は手に入るが、
requremement.txtしか吐き出せないため環境再現性が低い。


# 目的
というわけで、
**①環境を汚さない**
**②環境再現性**
を両立できる方法を検証した。というのが全体像。

### メリット
①環境を汚さないので、何かあればフォルダ事消せばすべて解決
②環境再現性が保証されているので、同じ環境を完全に再現することが可能

# embetable pythonの入手とpipのインストール

https://qiita.com/Koki_Takada/items/e8e01743576afe97d4ef

pipを入れたところで作業終了。
「今回は例としてpandasというライブラリをpipでインストールする。」をやらないこと。
やってしまった場合は、フォルダを削除して、zipの解凍からやり直し。


# pipでpoetryをインストールする
・cmdを起動（以下の参考を参照
・python.exeが存在するフォルダへcd後、
・setuptoolsをupdate
・poetryをインストール
```
cd C:\Users\Desktop\python-3.11.6-embed-amd64
python.exe -m pip install -U pip setuptools
python.exe -m pip install poetry
```

うまくいっていれば、Scriptsフォルダ内にpoetry.exeができている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3976724/8349d270-28fd-e84c-bf95-4768a20eed0b.png)

参考

https://qiita.com/kob58im/items/64dfc4d97272398a63af


# poetry.exeで仮想環境用のパッケージを作る
・cmdを起動（コード割愛
・poetry.exeが存在するフォルダに移動
・環境を作る（デスクトップにtest1という名前でフォルダを作ってもらう事にした
```
cd C:\Users\Desktop\python-3.11.6-embed-amd64\Scripts
poetry.exe new C:\Desktop\test1
```
うまく完了すれば、「Created package test1 in C:/Users/Desktop/test1」と出る

# poetryで仮想環境を作成する
・cmdを起動（コード割愛
・poetry.exeが存在するフォルダに移動
・仮想環境の情報をtomlと同じところに置く設定をする（絶対に必要）
・仮想環境を構築（クソ長い。パスを通していないため、直接指定する必要があるため）
※poetryが複数存在する場合などを想定してフルパスで指定している
```
cd C:\Users\Desktop\python-3.11.6-embed-amd64\Scripts
poetry.exe config virtualenvs.in-project true
C:\Users\Desktop\python-3.11.6-embed-amd64\Scripts\poetry.exe install --directory C:\Users\Desktop\test1
```
うまく完了すれば、以下のようになるはず
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3976724/e97c9473-96d6-0fbe-28ac-3da4022c49dd.png)


参考

https://zenn.dev/rihito/articles/1b096b1f695f06


# 作った仮想環境を確認する
・cmdを起動（コード割愛
・仮想環境内のpython.exeが存在するフォルダへ移動
・仮想環境を起動
・Pythonのverを確認
```
cd C:\Users\Desktop\test1\.venv\Scripts
activate

# 画面が変わった後
python --version
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3976724/7c7ff633-00c6-7366-c2c6-7bbfc55b30ac.png)

こんな感じで出てくるはず

# poetryのverを確認する
・前項からの続き（仮想環境に入ったまま
・poetryのversionを確認する
```
poetry --version
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3976724/9a7d8d35-b9fd-2b4f-7f43-1b84012d12ec.png)

こんな感じで出てくるはず。
出てきたら、「deactivate」を入力して仮想環境から出る。
出たらcmdを閉じる。

# 仮想環境にすぐに入れるbatファイルを作成しておく
あると後々便利なので作っておく。
・フォルダを開く（今回はC:\Users\Desktop\test1）
・poetry_env.txtを作る（名称はなんでも良い）
・コマンドを書き込む（以下を参照。要はScript内のactivateを動かせっていう命令文）
・「.txt」を「.bat」に変更する
```
@echo off
cd .\.venv\Scripts
call activate.bat
cmd
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3976724/673d017a-2dfb-bcd4-338c-92cc441f48e8.png)

出来上がったbatをダブルクリックすると、仮想環境に入った状態でcmdが起動する。
後々、便利。終わったら、右上のバツを押すなりして消す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3976724/cc5e5d01-5c19-3697-1505-633e959f72a5.png)

以上で環境構築自体は完了。

# poetryを自由に使う
詳しいことは、先人たちが記載済なので割愛

参考

https://qiita.com/ksato9700/items/b893cf1db83605898d8a

https://qiita.com/yokohama4580/items/dc6ba7259e99cad0dd65

### 例：jupyter labを入れてみる
・poetry_env.batをダブルクリック
・poetry add jupyterlab と入力(Writing lock fileと出たら完了）
・jupyter labを起動（しばらく時間かかる）
```
poetry add jupyterlab

# Writing lock fileと出たら
jupyter lab
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3976724/f230f38a-8c52-1de2-4345-e90fd58f399c.png)
こんな感じで出る

pandasなどほぼ必須なライブラリは当然入っていないので、自分でaddしてください。
※もし、ライブラリをaddしたときにエラーでたら以下を参照

https://qiita.com/insilicomab/items/278abf53a82a12fe4f01


# VSCodeを使う（Portable）
準備

https://chigusa-web.com/blog/vs-code%E3%81%AE%E3%83%9D%E3%83%BC%E3%82%BF%E3%83%96%E3%83%AB%E7%89%88%E3%81%AE%E5%88%A9%E7%94%A8/

interprinterの選択

https://blog.logical.co.jp/entry/2021/04/19/160000


# あとがき
偉大なる先人の皆さんはお気づきのように、Pythonのver指定がとても面倒です
（3.10.1と3.10.2を使うなら、２つEmbeddable Pythonが必要）
本当はpyenvで楽をしたかったのですが、環境を汚さない方法がわかりませんでした。
偉大な人がPython用意するの面倒な問題は解決してくれるでしょう。

まぁフツー（パス通せる環境）ならrye使うよ。