Pythonのパッケージ管理ベストプラクティス

# はじめに
[こちらの記事](https://qiita.com/c60evaporator/items/ba41cef4b37465c39948)でも紹介しましたが。**Pythonの仮想環境やパッケージ管理は様々なツールが乱立**しており、[2021年のAnaconda有料化](https://qiita.com/tfukumori/items/f8fc2c53077b234384fc)以降その傾向がさらに増したと感じています。

初学者がPythonを始める際にまず戸惑うのがこの環境構築部分だと思うので、その指針となるよう**OSごとにベストな環境を検討**し、**ベストプラクティスと呼べる記事**を目指したいと思います。

より良い記事を目指したいので、間違いや抜け漏れ等ありましたら、コメントで指摘頂けますと幸いです！

<br>

# 前提条件
以下の条件のもとでの環境構築を記事の対象とします。

- エディタは**Visual Studio Code**を使用
- **商用無料**のツールに限る (Anacondaは対象外)
- OSは**①Windows**, **②Mac(M1/M2)**, **③Linux**(Ubuntu等)の3種類を対象とする（Intel Macは扱わない）
- **Docker**はPythonに限定されない仮想化手法のため、**本記事では扱わない**

また、Pythonにおける「パッケージ」は「ライブラリ」と呼ばれる事も多いですが、本記事では「パッケージ」表記に統一します。

<br>

# まとめ

いきなり結論から述べますが、**以下3種類の方法の中**から、**用途やOSに応じて使い分ける**のが良いかと思います

|　　　　　　　|[1.pyenv + venv](https://qiita.com/c60evaporator/items/b6a7394231d1e768ce64#1-pyenv--venv)|[2.pyenv + Poetry](https://qiita.com/c60evaporator/items/b6a7394231d1e768ce64#2pyenv--poetry)|[3.Conda + conda-forge](https://qiita.com/c60evaporator/items/b6a7394231d1e768ce64#3-conda--conda-forge)|
|---|---|---|---|
|導入の手軽さ|◎<br>(venvはデフォルトインストール済)|◯<br>(コマンドでインストール可)|×<br>(リポジトリの指定等がやや複雑)|
|学習の手軽さ|×<br>(pyenvとvenvの学習が必要)|×<br>(pyenvとPoetryの学習が必要)|◯<br>(condaコマンドのみ学習でOK)|
|パッケージ依存関係の解決|×|◯|◯|
|**Windowsおすすめ**|◯<br>(本番環境との親和性重視<br> =Web開発向き)|◯<br>(バランス重視)|◯<br>(操作の簡単さ重視)|
|**Macおすすめ<br>(M1/M2)**|◯<br>(非対応の機械学習パッケージあり)|◯<br>(非対応の機械学習パッケージあり)|◎<br>(M1/M2 Macへの対応が早い)|
|**Linuxおすすめ**|◎<br>(シンプルさ重視)|◯<br>(依存関係の解決重視)|◯<br>(Macと共通化したい場合)|

※おすすめの基準には上記「導入の手軽さ」「学習の手軽さ」「パッケージ依存関係の解決」以外に、「対象OSとの相性」「検索による情報の見つかりやすさ」を考慮しています。詳しくは後述します

**筆者の主観**が入りますが、概ね**以下のフローチャートのように選択**すると良いかと思います ([詳しくは後述](https://qiita.com/c60evaporator/items/b6a7394231d1e768ce64#選択フローチャート)します)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/16209fbb-8378-ba39-dfce-413d72c96e00.png)

なお、実用上ハマりやすい**プロキシ環境での使用方法**についても、以下の記事に別途まとめました

https://qiita.com/c60evaporator/items/7a757134d028a7734118

<br>

# 必要知識
ここから先は、Pythonのパッケージ管理が何をやっているかを解説します。
「御託はいいから早く使いたい！」という方は、「[**3種類の方法比較**](https://qiita.com/c60evaporator/items/b6a7394231d1e768ce64#3種類の方法比較)」の項目まで飛んでください

まず、一般的に「**パッケージ管理**」と呼ばれている要素を、以下の**4つの機能に分割**して考える必要があります。

A. **インタプリタ切替** (Pythonのバージョンを切り替える)
B. **パッケージ切替** (パッケージのバージョンを切り替える)
C. **パッケージインストール** (パッケージをインストールする)
D. **リポジトリ** (パッケージのインストール元)

一般的に「パッケージ管理ツール」と呼ばれているものは、**上記機能の一部のみをカバー**しているため、全ての機能を実現するためには**複数のツールを組み合わせる**必要があります。

それぞれの機能について紹介を進めます。

### A.インタプリタ切替
**Pythonには複数のバージョンが存在**します。

[Python公式ホームページ](https://www.python.org/downloads/)からは`3.11.1`や`3.9.16`のように多くのバージョンがダウンロードできますが、ここで**どのバージョンを選ぶか**で、**対応OSやパッケージ、コードの挙動等に差が生じる**事があるため、システム開発時には明示的に指定する事が求められます。

このような**Python本体のバージョンの切替**を「**インタプリタ切替**」と呼び、**以下のようなツールで実現**できます

**・主なインタプリタ切替ツール**

|ツール名称|概要|
|---|---|
|pyenv|古くから用いられており、情報が多い|
|pyenv-virtualenv|同一バージョンのインタープリタ環境を複数準備できる<br>(操作が複雑なため本記事では紹介せず)|
|Conda|後述の「B.パッケージ切替」「C.パッケージインストール」を同一ツールで実現できる|

なお、[こちらの記事](https://qiita.com/shibukawa/items/0daab479a2fd2cb8a0e7#チャート)で紹介されているように、**Windowsでは**複数バージョンのPythonのexeファイルを各々インストールすればインタプリタ切替を実現できるので、**pyenv等のインタプリタ切替ツールは基本的に不要**です (3.7.6と3.7.7のように最下位のマイクロバージョンのみ異なるインタプリタを両方インストールしたい場合pyenvが必要となりますが、レアケースだと思います)

またMacやLinuxであっても、**Pythonのバージョンを変える必要がない場合、pyenv等のインタプリタ切替ツールは不要**です。こちらの方が運用はシンプルになるでしょう

<br>

### B.パッケージ切替
パッケージ(ライブラリ)のバージョンを管理します。

一般的に「**仮想環境**」と呼ばれているものは、「A. インタプリタ切替」「B.パッケージ切替」を併せて、**Pythonのバージョンとパッケージのバージョンを変えた環境を複数作成**することを指します。

パッケージ切替には、主に以下のツールを活用できます

**・主なパッケージ切替ツール**

|ツール名称|概要|
|---|---|
|venv|Pythonにデフォルトで入っている|
|Pipenv|「C.パッケージインストール」機能も兼ねる＆依存関係の管理|
|Poetry|Pipenvとほぼ同機能だが、後発でよりモダンな構成となっている|
|Conda|「A.インタプリタ切替」「C.パッケージインストール」を同一ツールで実現できる|

なおPipenvとPoetryは機能が似通っておりますが、以下のGithubスターの推移からも分かる通り、後発のPoetryの普及が進んでいるため、**本記事ではPipenvは取り扱わない**事とします（[Pipenvの使用法はこちらの記事](https://qiita.com/c60evaporator/items/ba41cef4b37465c39948#2-pipenvの使用法)を参照ください）

<img width=480 src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/7d0dc674-a767-8f77-459c-c1815134ec84.png>

<br>

### C.パッケージインストール
「D.リポジトリ」からパッケージをローカル側にダウンロードしてインストールする機能です。

**・主なパッケージインストールツール**

|ツール名称|概要|
|---|---|
|pip|Pythonにデフォルトで入っている。本番環境(Docker)では殆どの場合これが使用される|
|Pipenv|「B.パッケージ切替」機能も兼ねる＆依存関係の管理|
|Poetry|Pipenvとほぼ同機能だが、後発でよりモダンな構成となっている|
|Conda|「B.パッケージ切替」「C.パッケージインストール」を同一ツールで実現できる|

「B.パッケージ切替」と似通ったツール構成となっていますが、1番目のpipを選択した場合のみツールが別となります (とはいえpipもvenvもPythonにデフォルトで含まれているため、インストールは不要)

なお、パッケージのインストール元は「D.リポジトリ」に依存するため、同じツールで同じコマンドでインストールを実行したとしても、「D.リポジトリ」が異なるとインストールされるパッケージのバージョンは変わることにご注意ください。

<br>

### D.リポジトリ
こちらはツールというよりデータ取得元の話となりますが、**Pythonの各種パッケージ**をインストールするためには、**インストール元**となるインターネット上のデータ格納場所(**リポジトリ**)が必要となります。

知識として抜けがちな要素ですが、Mac (M1/M2)での環境構築や、Condaにおける有料化回避において非常に重要な知識となります。

**・主なリポジトリ**

|名称|「C.パッケージインストール」との関係|概要|
|---|---|---|
|PyPI|pip, Poetryがデフォルトで使用|誰でも自由にアップロードできる無料リポジトリ|
|(Anaconda)|Anaconda, Minicondaがデフォルトで使用|Anaconda社が管理する有料リポジトリ|
|conda-forge|Miniforgeがデフォルトで使用|一般ユーザコミュニティが管理する無料リポジトリ([参考](https://www.capa.co.jp/archives/41290))|

それぞれ簡単に解説します

#### ・PyPIリポジトリ
PyPIリポジトリは[こちらの記事](https://qiita.com/c60evaporator/items/e1ecccab07a607487dcf)で紹介したように、**誰でもアップロードできる**門戸が広く設定されたリポジトリと呼べ、pipやPoetryでデフォルト使用されている事から、最も広く活用されています。
よって

- 最新のバージョンがいち早く反映される
- 対応しているパッケージの種類が多い
- 将来的に本番環境への移植を想定する場合、リポジトリを揃えられる(Docker等では基本的に運用がシンプルなPyPIリポジトリを利用するケースが多い)

等のメリットがありますが、自由であるために管理が行き届かないケースも多く、**不具合や特定の環境で動作しないバージョン**のパッケージがインストールされてしまう**リスク**もあります。

とはいえ**WindowsやLinux**でメジャーどころのパッケージをインストールする場合、このような不具合情報が迅速に共有されて修正される事が多いので、基本的には**PyPIを採用するケースが多い**です。

一方で**注意すべきはM1/M2 Mac** (Apple Silicon)で、CPUのアーキテクチャ(arm64)が最大手のIntel/AMD勢(amd64)と大きく異なるため、[こちらの記事で紹介](https://qiita.com/c60evaporator/items/aef6cc1581d2c4676504#python環境構築)したようにamd64用に準備されたバージョンのパッケージが動かないケースも多く、パッケージ側の対応も遅れがちです。このケースではApple Siliconへの対応が早い[**conda-forgeリポジトリ**](https://qiita.com/c60evaporator/items/b6a7394231d1e768ce64#conda-forgeリポジトリ)**がおすすめ**です

#### ・Anacondaリポジトリ
Anaconda社が管理するリポジトリで、Anaconda社の選んだ**安定したバージョンのパッケージ**を選んでインストールしてくれるため、PyPIリポジトリよりも不具合発生リスクが低い（ただし、最新バージョンの反映は遅い）ですが、[2021年より**商用利用が有料化**](https://qiita.com/tfukumori/items/f8fc2c53077b234384fc)されています。

なお、Anacondaよりもパッケージ数を絞ったMinicondaという構成も存在します(下図参照)

<img width=480 src=https://www.elsa-jp.co.jp/wp-content/uploads/2022/04/anaconda_02.png>

#### ・conda-forgeリポジトリ
Anacondaリポジトリと近い (パッケージ構成が上述のMinicondaに近い)ですが、こちらは企業ではなく[オープンソースコミュニティが管理](https://conda-forge.org/)しているリポジトリのため、**無料**で使用できます。

他の機能(前述のA〜C)で**Condaを利用**しつつAnacondaの**有料化を回避**するためには、デフォルトのリポジトリをconda-forgeに切り替える事が必要となります。([後述](https://qiita.com/c60evaporator/items/b6a7394231d1e768ce64#参考minicondaインストーラによるインストール))

また特筆すべきはApple Siliconへの対応の早さで、[前述のPyPIにおけるApple Siliconでの不具合の多さ](https://qiita.com/c60evaporator/items/b6a7394231d1e768ce64#pypiリポジトリ)を鑑みると、**M1/M2 Macではconda-forgeリポジトリが第一の選択肢**となるかと思います。

<br>

### 冒頭で紹介した3方法で使用しているツール
ここまで「A. インタプリタ切替」「B. パッケージ切替」「C. パッケージインストール」「D. リポジトリ」の4機能の概要と使用ツールについて解説しました。

[冒頭で紹介した3種類の方法](https://qiita.com/c60evaporator/items/b6a7394231d1e768ce64#まとめ)では、それぞれどのツールを利用しているかを以下にまとめました。

||1.pyenv + venv|2.pyenv + Poetry|3. Conda + conda-forge|
|---|---|---|---|
|A.インタープリタ切替|pyenv|pyenv|Conda|
|B.パッケージ切替|venv|Poetry|Conda|
|C.パッケージインストール|pip|Poetry|Conda|
|D.リポジトリ|PyPI|PyPI|conda-forge|

venvと比べてPoetryの方が、Poetryと比べてCondaの方が使用するツールの数が減り、管理が統一化できる事が分かります。

<br>
<br>
<br>

# 3種類の方法比較
[冒頭のまとめ](https://qiita.com/c60evaporator/items/b6a7394231d1e768ce64#まとめ)で3種類の方法を紹介しましたが、具体的にどのように選択するかを解説します

## 選択フローチャート
**筆者の主観**が入りますが、概ね**以下のようなフローで選択**すると、**OSや用途に適したパッケージ管理構成**を実現できるかと思います (インタプリタ切替に関しては[こちらの記事](https://qiita.com/shibukawa/items/0daab479a2fd2cb8a0e7)を参考にさせて頂きました)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/16209fbb-8378-ba39-dfce-413d72c96e00.png)

<br>

## Windowsの場合
Windowsはどの方法でもパッケージ管理ができ、いずれの方法もよく利用されているためGoogle検索で情報も得やすいです。

以下のメリット・デメリットを鑑みて、用途に応じて選択するのが良いかと思います
(なお、[前述のように](https://qiita.com/c60evaporator/items/b6a7394231d1e768ce64#aインタプリタ切替)Windowsではpyenvは使用しない事にご注意ください)

|　　　　　　　|1.venv|2.Poetry|3.Conda + conda-forge|
|---|---|---|---|
|**最新バージョンのパッケージ利用**|◎<br>(PyPIリポジトリ)|◎<br>(PyPIリポジトリ)|◯<br>(conda-forgeリポジトリの場合。[PyPIリポジトリを利用](https://qiita.com/c60evaporator/items/b6a7394231d1e768ce64#pypiリポジトリ)すれば最新バージョンのインストールも可)|
|**依存関係の管理**|×|◯|◯|
|**パッケージインストールエラーの少なさ**|×<br>(未管理のPyPIリポジトリ)|×<br>(未管理のPyPIリポジトリ)|◯<br>(管理されたconda-forgeリポジトリ)|
|[**ツールの統一性**](https://qiita.com/c60evaporator/items/b6a7394231d1e768ce64#冒頭で紹介した3方法で使用しているツール)|×<br>(venv+pipの2種類)|◯<br>(Pyenvの1種類)|◯<br>(Condaの1種類)|
|**本番環境(Docker+pip)との親和性**|◎<br>(リポジトリとインストールツールを揃えられる)|◯<br>(リポジトリを揃えられる)|×<br>(リポジトリもインストールツールも異なる)|

いずれも一長一短ですが、

- **初心者 or 管理されたリポジトリでインストールエラーを減らしたい**: 「**3.Conda + conda-forge**」
- **最新バージョンを使いたい or 本番環境への移植も想定したい**: 「**2.Poetry**」
- **本番環境との親和性最優先**: 「**1.venv**」

のように使い分けるのがおすすめです。

**迷ったら、以下がおすすめです**

**Web開発**: 「**1.Conda + conda-forge**」 (@shibukawa さんのコメントより)

**数値計算・機械学習**: 「**3.Conda + conda-forge**」（筆者の過去の経験上、PyPIで最新版に上げるとnumpy等の数値計算パッケージでエラーが出る事が多かったので、安定版の提供を重視したconda-forgeリポジトリの方が試行錯誤なく使いやすいと感じています）

またインタプリタ切替が必要であれば、「1. pyenv + venv」「2.pyenv + Poetry」はインタプリタ用(pyenv)とパッケージ切替用(venv, Poetry)の2種類の仮想環境を使い分ける必要があり、操作がやや煩雑です。Condaは仮想環境を1種類に統一できるので、その分管理がシンプルになります。

※なお、Windows環境でWSLやDockerを使用する場合、内部のOSは基本的にLinuxとなるため、「[Linuxの場合](https://qiita.com/c60evaporator/items/b6a7394231d1e768ce64#linuxの場合)」を参照ください

<br>

## Mac (M1/M2)の場合
[前述のように](https://qiita.com/c60evaporator/items/b6a7394231d1e768ce64#pypiリポジトリ)、M1/M2 Mac (Apple Silicon)ではPyPIリポジトリによるインストールでは不具合が出るケースが多いため、基本的にはconda-forgeリポジトリを簡単に利用できる「**3.Conda + conda-forge**」**がおすすめ**です

※なお、M1/M2 Mac環境でDockerを使用する場合、コンテナ内のOSは基本的にLinuxとなるため、「[Linuxの場合](https://qiita.com/c60evaporator/items/b6a7394231d1e768ce64#linuxの場合)」を参照ください

### ※直近の対応状況

@shibukawa さんの[コメント](https://qiita.com/c60evaporator/items/b6a7394231d1e768ce64#comment-61ce43f95503f76b283f)によると、2023/3現在メジャーなパッケージのApple Siliconネイティブ対応もかなり進んで来ており、特にWeb系で利用するパッケージは基本的にPyPIからのインストールでもエラーの発生は稀で、「1.pyenv + venv」「2.pyenv + Poetry」でも問題なく利用できるそうです

一部の機械学習パッケージ (LightGBM, TensorFlow, PyTorch)はまだconda-forgeからインストールする必要があるようなので、機械学習用途を想定するのであれば「3.Conda + conda-forge」を使用した方が良さそうです

<br>

## Linuxの場合
Windowsの場合と選択肢は似ていますが、本番環境を想定した運用が多いことや、PoetryやCondaの活用例の少なさを考慮すると、**Windowsと比べ「1.pyenv + venv」の優位性が高まる**と考えています。
(なお、Windowsの場合と異なり、1, 2の方法でインタプリタ切替を実現したい場合pyenvのインストールが必要となる事にご注意ください)

また、Linux環境での使用率が高いDockerとの相性も、追加ツールのインストールが不要でDockerfile等の構成をシンプルにできる「1.pyenv + venv」に分があると言えそうです

|　　　　　　　|1.pyenv + venv|2.pyenv + Poetry|3.Conda + conda-forge|
|---|---|---|---|
|**最新バージョンのパッケージ利用**|◎<br>(PyPIリポジトリ)|◎<br>(PyPIリポジトリ)|◯<br>(conda-forgeリポジトリの場合。[PyPIリポジトリを利用](https://qiita.com/c60evaporator/items/b6a7394231d1e768ce64#パッケージのインストール-2)すれば最新バージョンのインストールも可)|
|**依存関係の管理**|×|◯|◯|
|**パッケージインストールエラーの少なさ**|×<br>(未管理のPyPIリポジトリ)|×<br>(未管理のPyPIリポジトリ)|◯<br>(管理されたconda-forgeリポジトリ)|
|[**ツールの統一性**](https://qiita.com/c60evaporator/items/b6a7394231d1e768ce64#冒頭で紹介した3方法で使用しているツール)|×<br>(pyenv+venv+pipの3種類)|◯<br>(pyenv+Poetryの2種類)|◎<br>(Condaの1種類)|
|**本番環境(Docker+pip)との親和性**|◎<br>(リポジトリとインストールツールを揃えられる)|◯<br>(リポジトリを揃えられる)|×<br>(リポジトリもインストールツールも異なる)|
|**検索性**|◯<br>(活用例多い)|×<br>(活用例少ない)|×<br>(活用例少ない)|
|**インストールツールの少なさ**|◎<br>(pyenv, インタプリタ切替が不要ならなし)|×<br>(pyenv+Poetry, インタプリタ切替が不要ならPoetryのみ)|◯<br>(Conda)|

**Linuxは共用環境やテスト環境として使われる事が多い**という特性上、「余計なツールは入れたくない」「本番環境に近づけたい」という需要が高いと考察されます。追加でインストールが必要な「2.Poetry」や「3.Conda」よりも、デフォルトでインストールされている「**1.venv**」の方がこの**用途にマッチしている**と言えるでしょう。(Linux環境で開発した成果物は本番用のDockerに移植するケースも多く、その際にrequirements.txtを流用できる事も、Linuxで1.venvを利用するメリットとなりそうです)

あくまで分析等のアドホックな用途に絞る場合や、M1/M2 Macと環境を統一化したい場合([こちらの方が記事にされています](https://zenn.dev/karaage0703/articles/f3254b14898b4d))は、「2.Poetry」や「3.Conda」も選択肢に入るかと思います

また[Tensorflow](https://www.tensorflow.org/install/pip)や[PyTorch](https://pytorch.org/get-started/locally/)等の深層学習フレームワークを使用する場合、公式でもCondaによる依存パッケージのインストールを推奨しているので、これらのライブラリを使用する場合は本番環境との親和性の観点でも「3.Conda」を利用しても良いかと思います。

# 実践
[先ほど紹介した3つの方法](https://qiita.com/c60evaporator/items/b6a7394231d1e768ce64#3種類の方法比較)でパッケージ管理を実践する方法を紹介します。
(各方法へは以下リンクからも飛べます)

- [**1. pyenv + venv**](https://qiita.com/c60evaporator/items/b6a7394231d1e768ce64#1-pyenv--venv)
- [**2. pyenv + Poetry**](https://qiita.com/c60evaporator/items/b6a7394231d1e768ce64#2pyenv--poetry)
- [**3. Conda + conda-forge**](https://qiita.com/c60evaporator/items/b6a7394231d1e768ce64#3-conda--conda-forge)

## 基本的な流れ
基本コンセプトとして、**プロジェクトごとに仮想環境を作成してパッケージを使い分け**、不要になったら仮想環境を削除して**ベースのPython環境は綺麗な状態を保つ**事が望ましいです。

上記のコンセプトに従い、以下の流れで開発環境 (パッケージ管理環境)を構築します

**①必要ツールのインストール** (最初の1回のみ)
**②仮想環境作成**
**③仮想環境にパッケージをインストール**
**④エディタに仮想環境を紐付ける**

なお、コマンドはWindowsの場合PowerShellまたはコマンドプロンプト、Macの場合はターミナル(zsh)、Linuxの場合はターミナル(bash)で実行する事を前提とします。

## 事前準備
Pythonの環境を構築する前に、以下の記事を参考に開発に必要なVSCodeをインストールしてください

https://qiita.com/c60evaporator/items/90c071465eb82a12f6be

<br>
<br>
<br>

# 1. pyenv + venv
「1. pyenv + venv」による具体的なパッケージ管理手順を解説します

## ①必要ツールのインストール
[Windows](https://qiita.com/c60evaporator/items/b6a7394231d1e768ce64#windowsの場合-1), [Mac](https://qiita.com/c60evaporator/items/b6a7394231d1e768ce64#m1m2-macの場合), [Linux](https://qiita.com/c60evaporator/items/b6a7394231d1e768ce64#linuxubuntuの場合)の場合それぞれインストール方法を解説します
([前述のように](https://qiita.com/c60evaporator/items/b6a7394231d1e768ce64#まとめ)M1/M2 Macではvenvは非推奨ですが、インストール方法の紹介はします)

### Windowsの場合
[前述のように](https://qiita.com/c60evaporator/items/b6a7394231d1e768ce64#aインタプリタ切替)pyenvはインストール不要なので、以下のみをインストールします

- インタプリタ切替: Pythonのexeファイルをインストール

#### ・Pythonのexeファイルをインストール
[Python公式](https://www.python.org/downloads/)から、必要なバージョンのPythonのexeファイルをダウンロードしてインストールします。
exeファイルを開いたら以下の`Install Now`を押し、指示に従って進めばOKです。

<img width=480 src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/46918b0a-41fa-a6ed-bc90-9cb3c03bdf4a.png>

なお、2023年時点のWindows Pythonインストーラは「Pythonランチャ」という複数バージョン切替機能が追加されているため、「Add python.exe to PATH」のチェックは不要です([参考](https://gammasoft.jp/python/python-version-management/))

複数のPythonバージョン(インタプリタ)を使い分けたい場合、複数のexeファイルをインストールすればOKです。
インストール済のPythonバージョン一覧は以下コマンドで表示できます。

```console
py -0p
```

<br>

### M1/M2 Macの場合
[前述のように](https://qiita.com/c60evaporator/items/b6a7394231d1e768ce64#まとめ)M1/M2 Macでvenv (というよりPyPIリポジトリ)の利用は**推奨しません**が、以下をインストールする事で使用自体は可能です

- インタプリタ切替: pyenvをインストール

また[前述のように](https://qiita.com/c60evaporator/items/b6a7394231d1e768ce64#aインタプリタ切替)、**Pythonのバージョンを変える必要がない場合pyenvは不要**なので、インストールするかは適宜選択してください

#### ・pyenvのインストール
[こちらを参考](https://github.com/pyenv/pyenv#installation)にインストールを進めます。

まず、以下コマンドでHomebrewを使用してpyenvをインストールします

```zsh
brew update
brew install pyenv
```


以下コマンドで、pyenvのバージョンを確認します

```zsh
pyenv -v
```

##### ※pyenvへのパスの通し方
以下操作でpyenvにパスを通し、スタートアップ時からpyenvが適用されるようにできます

以下コマンドでシェルの種類を確認します

```zsh
echo $SHELL
```

`/bin/zsh`のように表示されればシェルはzsh、`/bin/bash`のように表示されればシェルはbasyです。最新版のMacOSであれば基本的にはzshのはずなので、その前提で操作を進めます。

以下コマンドでpyenvの設定がシェルに適用されます

```zsh
eval "$(pyenv init -)"
```

以下コマンドでスタートアップ設定 (~/.zshrc)にパスを通す事もできます
(M1/M2 Macではpyenvをメインで使用しない方が良いので、**本操作は基本的に実施しない方が良いでしょう**)

```zsh
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc
echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc
echo 'eval "$(pyenv init -)"' >> ~/.zshrc
```

<br>

### Linux(Ubuntu)の場合
以下をインストールする必要があります

- インタプリタ切替: pyenvをインストール

なお[前述のように](https://qiita.com/c60evaporator/items/b6a7394231d1e768ce64#aインタプリタ切替)、**Pythonのバージョンを変える必要がない場合pyenvは不要**なので、インストールするかは適宜選択してください

#### ・pyenvのインストール
[こちらを参考](https://github.com/pyenv/pyenv#installation)にインストールを進めます。

まず、以下コマンドでpyenvをGitHubからダウンロードします。

```bash
git clone https://github.com/pyenv/pyenv.git ~/.pyenv
```

##### ※pyenvへパスを通す
以下コマンドでpyenvにパスを通し、スタートアップ時からpyenvが適用されるようにします
(pyenvをメインで使用したくない場合は本操作は不要です)

```bash
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc
```

## ②仮想環境作成
プロジェクトに紐づいた仮想環境を作成します。

### プロジェクト用フォルダの作成
エクスプローラやFinder、mkdirコマンド等で、下図のような感じで環境構築したいフォルダ(プロジェクト用のディレクトリ)を準備しておきます

<img width=400 src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/68d8f8e9-0b36-d53f-c2e6-7e7d8d75bd27.png>

作成したフォルダに以下コマンドで飛び、以降の操作を進めます

```console
cd 作成したプロジェクト用フォルダのパス
```

### pyenvでインタプリタ切替
※pyenvを使用しない場合 (**Windows使用時** or Pythonのバージョン切替が不要な場合)、**本作業は不要**です。「[・Pythonバージョンの確認](https://qiita.com/c60evaporator/items/b6a7394231d1e768ce64#pythonバージョンの確認)」に飛んで下さい

以下コマンドで、pyenvでインストールできるPythonのバージョンを確認します

```console
pyenv install -l
```

表示されたバージョンの中から、インストールしたいバージョンのインタプリタを選択し、以下コマンドでインストールします (既に欲しいバージョンをインストール済の場合は不要)

```console
pyenv install バージョン名
```

例えば3.11.1をインストールしたい場合、以下コマンドでインストールします

```console
pyenv install 3.11.1
```

インストール済のバージョンは、以下コマンドで確認できます

```
pyenv versions
```

以下コマンドで、プロジェクト用フォルダにPythonバージョンを反映します([参考](https://qiita.com/m3y/items/45c7be319e401b24fca8#%E7%89%B9%E5%AE%9A%E3%81%AE%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E9%85%8D%E4%B8%8B%E3%81%AE%E3%81%BF%E5%88%A9%E7%94%A8%E3%81%99%E3%82%8B%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E3%81%AE%E8%A8%AD%E5%AE%9A))
([事前に`cd プロジェクト用フォルダのパス`コマンドで該当ディレクトリに移動してください](https://qiita.com/c60evaporator/items/b6a7394231d1e768ce64#プロジェクト用フォルダの作成))

```
pyenv local バージョン名
```

以下コマンドで反映したバージョンが表示されれば成功です

```
pyenv version
```

### Pythonバージョンの確認
以下コマンドで該当フォルダの環境を表示し、目当てのPythonバージョンが表示されることを確認します

```
cd プロジェクト用フォルダのパス
python --version
```

なお、インタプリタ切替を実施したのにうまくバージョンが反映されない (システムデフォルトのPythonバージョン等が表示される)場合、基本的にはPythonのexeやpyenvにパスが通っていない事が原因の事が多いので、OS毎に以下を参考にしてください

#### ・Windowsの場合
以下コマンドでインストールされているPythonバージョンの一覧を表示します

```
py -0p
```

```:実行結果
-V:3.11 *      C:\Users\ユーザ名\AppData\Local\Programs\Python\Python311\python.exe
-V:3.10        C:\Users\ユーザ名\AppData\Local\Programs\Python\Python310\python.exe
```

[後ほどvenvで仮想環境作成](https://qiita.com/c60evaporator/items/b6a7394231d1e768ce64#venvで仮想環境作成)する際の`python -m venv [新しい環境名]`というコマンドを、`py -バージョン名 venv [新しい環境名]`のように変える事で、パスが通っていなくとも以降の操作を実行できます。

例えば3.10を使用したい場合

```
py -3.10 -m venv [新しい環境名]
```

となります

※ @natsuriver さんに[コメント頂きました](https://qiita.com/c60evaporator/items/b6a7394231d1e768ce64#comment-5f66345045dd3216a6ba)が、

```
~\AppData\Local\Programs\Python\Python310\python.exe -m venv --upgrade-deps [新しい環境名]
```

のようにインタプリタのexeファイルをフルパス指定しても、同様の操作を実現できるようです。

#### ・M1/M2 Macの場合
[前述のように](https://qiita.com/c60evaporator/items/b6a7394231d1e768ce64#pyenvへのパスの通し方)`eval "$(pyenv init -)"`コマンドでシェルにpyenvのパスを適用します

#### ・Linuxの場合
[pyenvへパスを通す](https://qiita.com/c60evaporator/items/b6a7394231d1e768ce64#pyenvへパスを通す)を実施したのち、再起動してください。

<br>

### venvで仮想環境作成

venvでパッケージ切替用の仮想環境を作成します。

以下コマンドで、プロジェクト用フォルダ内に仮想環境を作成します。「新しい環境名」は自由命名でOKです

```
cd プロジェクト用フォルダのパス
python -m venv [新しい環境名]
```

Windosの場合は[前述のように](https://qiita.com/c60evaporator/items/b6a7394231d1e768ce64#windowsの場合-2)以下コマンドで実行します

```
cd プロジェクト用フォルダのパス
py -バージョン名 venv [新しい環境名]
```

以下のように作成した仮想環境用のフォルダが生成します

<img width=320 src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/51ead642-5831-6653-0352-573b6876c9c4.png>

## ③仮想環境にパッケージをインストール
作成した仮想環境にパッケージをインストールします

### 仮想環境のアクティベート
パッケージのインストール前に、対象の仮想環境を有効化します

OSに応じて**以下のコマンドで仮想環境をアクティベート**できます

**Linux/Macの場合**: `source [環境名]/bin/activate`
**Windows(コマンドプロンプト)の場合**: `[環境名]\Scripts\activate.bat`

下記のようにアクティベートした環境名がシェルの最初にカッコ表示されれば成功です

```console
(環境名) [カレントフォルダ名]>
```

`deactivate`コマンドで、仮想環境を終了(デアクティベート)できます

```console
(環境名) [カレントフォルダ名]> deactivate
```

※ちなみにPowerShellでアクティベートコマンドを実行すると、「このシステムではスクリプトの実行が無効になっているため、‥を読み込むことができません」というようなエラーが出ることがあります。
[こちらのリンク](https://www.python.jp/install/windows/venv.html)のように、 PowerShell のスクリプトの実行が実行ポリシーによって許可されていないことが原因なので、最初の1回のみ

```powershell
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser -Force
```
としてあげれば、スクリプトの実行が有効となり、
`[環境名]\Scripts\activate.ps1`
としてあげれば、アクティベートされます

#### ・パッケージのインストール
※仮想環境をアクティベートした状態からスタートしてください

下記のように`pip install [パッケージ名]`で、パッケージをインストールできます

```console
pip install パッケージ名
```

例えばpandasをインストールしたい場合は以下のようになります

```console
pip install pandas
```

`pip list`で、インストールされているパッケージのバージョンが確認できます

```console
(環境名) >pip list
Package         Version
--------------- -------
numpy           1.19.4 
pandas          1.1.4  
pip             20.2.1 
python-dateutil 2.8.1  
pytz            2020.4 
setuptools      49.2.1 
six             1.15.0 
```

<br>

## ④エディタに仮想環境を紐付ける
作成した仮想環境をエディタ(VSCode)に紐付けます

まずVSCodeで以下のようにプロジェクト用フォルダを開きます

<img width=400 src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/e9d3c6a5-4f70-6200-75cb-83ff083fca96.png>

以下のように適当な.pyファイルを作成し、右下のpythonバージョンをクリックしたのち、venvで作成済の仮想環境を選択します

<img width=600 src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/d01c4506-3795-1561-13ff-850cf281a004.png>

※作成した仮想環境がリストに見当たらない場合、`Enter interpreter path`をクリックして仮想環境フォルダ内のpython.exeのパスを指定します

## 【参考】その他pyenvの便利なコマンド
上で紹介したもの以外に、pyenvでよく使うコマンドを参考に記載します

### インストール済のバージョン一覧
繰り返しとなりますが、pyenvでインストール済のPythonバージョン一覧は以下で表示できます

```console
pyenv versions
```

### インストール済のPythonバージョンの削除
インストール済のPythonバージョンは以下で削除できます (バージョン名はすぐ上の`pyenv versions`で確認)

```console
pyenv uninstall バージョン名
```

### pyenvのアンインストール

#### ・Macの場合
[前述のように](https://qiita.com/c60evaporator/items/b6a7394231d1e768ce64#pyenvのインストール)Homebrewでインストールしていれば、以下コマンドでアンインストールできます

```console
brew uninstall pyenv
```

[pyenvへパスを通している場合](https://qiita.com/c60evaporator/items/b6a7394231d1e768ce64#pyenvへのパスの通し方)、.zshrcからも該当する3行を忘れずに削除してください

#### ・Linuxの場合
以下コマンドで、pyenvのルートフォルダを確認します (恐らく`$HOME/.pyenv`となっているはずです)

```zsh
printenv PYENV_ROOT
```

以下コマンドで、ルートフォルダを削除すればpyenvがアンインストールされます

```zsh
rm -rf pyenvのルートフォルダ
```

[pyenvへパスを通している場合](https://qiita.com/c60evaporator/items/b6a7394231d1e768ce64#pyenvへパスを通す)、.bashrcからも該当する3行を忘れずに削除してください

<br>

## 【参考】その他venvの便利なコマンド
venvでよく使うコマンドを参考に記載します

### 仮想環境のコピー
仮想環境をアクティベートした状態から下記コマンドで、パッケージ構成をrequirements.txtに出力できます。

```console
(環境名1) >python -m pip freeze > requirements.txt
```

このテキストファイル内に、インストールされているパッケージ一覧が記載されています

```requirement.txt
numpy==1.19.4
pandas==1.1.4
python-dateutil==2.8.1
pytz==2020.4
six==1.15.0
```

このテキストファイルを他のプロジェクトフォルダに移し、別の仮想環境を作成・アクティベートしたのち下記コマンドを打つと、該当するパッケージ全てをまとめてインストールしてくれます

```console
(環境名2) >python -m pip install -r requirements.txt
```

**チーム内でパッケージを共通化したい場合に便利ですね！**

ちなみに、仮想環境に入らずに同様のコマンドを実行すると、デフォルト環境にrequirements.txtに記載されたパッケージをまとめてインストールしてくれます。

### バージョンを指定してパッケージをインストール
以下のようにバージョンを指定してパッケージをインストールできます

```
pip install numpy==1.19.3
```

### パッケージのアンインストール
以下コマンドでパッケージをアンインストールできます。

```console
pip uninstall パッケージ名
```

### 仮想環境の初期化
デアクティベートした状態で、下記コマンドで初期化できます

```
python -m venv --clear [環境名]
```

### 仮想環境の削除
デアクティベートした状態で、仮想環境のフォルダを丸ごと削除するだけでOKです。
エクスプローラで仮想環境のフォルダを削除 (Mac, Linuxでは`rm -rf`コマンド)するか、
PowerShellで環境の存在するディレクトリに移動して下記コマンドを実行します

```
Remove-Item [環境名] -Recurse -Force
```

<br>
<br>
<br>

# 2.pyenv + Poetry
「2.pyenv + Poetry」による具体的なパッケージ管理手順を解説します

## ①必要ツールのインストール
[Windows](https://qiita.com/c60evaporator/items/b6a7394231d1e768ce64#windowsの場合-3), [Mac](https://qiita.com/c60evaporator/items/b6a7394231d1e768ce64#m1m2-macの場合-2), [Linux](https://qiita.com/c60evaporator/items/b6a7394231d1e768ce64#linuxubuntuの場合-1)の場合それぞれインストール方法を解説します
([前述のように](https://qiita.com/c60evaporator/items/b6a7394231d1e768ce64#まとめ)M1/M2 MacではPoetryは非推奨ですが、インストール方法の紹介はします)

なお、[公式](https://python-poetry.org/docs/#system-requirements)によるとPoetryは**Python3.7以上のみ対応**しているようです

### Windowsの場合
[前述のように](https://qiita.com/c60evaporator/items/b6a7394231d1e768ce64#aインタプリタ切替)pyenvはインストール不要であり、以下をインストールする必要があります

- インタプリタ切替: Pythonのexeファイルをインストール
- パッケージ切替: Poetryをインストール

#### ・Pythonのexeファイルをインストール
[**1.pyenv + venvの場合**](https://qiita.com/c60evaporator/items/b6a7394231d1e768ce64#pythonのexeファイルをインストール)と同様なので、こちらを参照ください

#### ・Poetryのインストール
[こちらの公式ホームページ](https://python-poetry.org/docs/)の方法に則り、インストールを進めます。

PowerShellから以下コマンドでPoetryをインストールできます

```powershell
(Invoke-WebRequest -Uri https://install.python-poetry.org -UseBasicParsing).Content | py -
```

上記コマンドを実行すると、途中で

```
To get started you need Poetry's bin directory (C:\Users\ユーザ名\AppData\Roaming\Python\Scripts) in your `PATH`
environment variable.`
```
のような、「パスを追加してください」的なメッセージが表示されるので、

環境変数設定([参考](https://imagingsolution.net/program/windows10/windows10_environment_variables/))のPathに以下のように`C:\Users\ユーザ名\AppData\Roaming\Python\Scripts`の部分を追加してください

<img width=480 src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/e9b7eb73-01bf-21c3-0dce-4a6cd1b6dc89.png>

<img width=400 src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/7be1b868-1bb2-ec0d-8b4c-0e019f8a98ed.png>

以下コマンドでPoetryのバージョンが表示されれば成功です

```powershell
poetry -V
```

<br>

### M1/M2 Macの場合
[前述のように](https://qiita.com/c60evaporator/items/b6a7394231d1e768ce64#まとめ)M1/M2 MacでPoetry (というよりPyPIリポジトリ)の利用は**推奨しません**が、使用時は以下をインストールする必要があります

- インタプリタ切替: pyenvをインストール
- パッケージ切替: Poetryをインストール

また[前述のように](https://qiita.com/c60evaporator/items/b6a7394231d1e768ce64#aインタプリタ切替)、**Pythonのバージョンを変える必要がない場合pyenvは不要**なので、インストールするかは適宜選択してください

#### ・pyenvのインストール
[**1.pyenv + venvの場合**](https://qiita.com/c60evaporator/items/b6a7394231d1e768ce64#pyenvのインストール)と同様なので、こちらを参照ください

#### ・Poetryのインストール
以下コマンドでHomebrewからインストールできます

```zsh
brew install poetry
```

以下コマンドでPoetryのバージョンが表示されれば成功です

```zsh
poetry -V
```

<br>

### Linux(Ubuntu)の場合
以下をインストールする必要があります

- インタプリタ切替: pyenvをインストール

なお[前述のように](https://qiita.com/c60evaporator/items/b6a7394231d1e768ce64#aインタプリタ切替)、**Pythonのバージョンを変える必要がない場合pyenvは不要**なので、インストールするかは適宜選択してください

#### ・pyenvのインストール
[**1.pyenv + venvの場合**](https://qiita.com/c60evaporator/items/b6a7394231d1e768ce64#pyenvのインストール-1)と同様なので、こちらを参照ください

#### ・Poetryのインストール
[こちらの公式ホームページ](https://python-poetry.org/docs/)の方法に則り、インストールを進めます。

以下コマンドでPoetryをインストールできます

```bash
curl -sSL https://install.python-poetry.org | python3 -
```

なお、curlをインストールしていない場合以下コマンドでインストールしてください

Debian系 (Ubuntu, RaspberryPi等)の場合: `sudo apt install curl`
RedHat系 (RHEL, Amazon Linux等)の場合: `sudo yum install curl`

以下コマンドでPoetryのバージョンが表示されれば成功です

```bash
poetry -V
```

<br>


## ②仮想環境作成
プロジェクトに紐づいた仮想環境を作成します。

### プロジェクト用フォルダの作成
「1.pyenv + venv」ではプロジェクト用フォルダを手動で作成しましたが、Poetry使用時はPoetryコマンドで作成すると、この後の操作がやりやすくなります。

以下コマンドで、プロジェクト用フォルダを作成します

```console
cd プロジェクト用フォルダの上位フォルダのパス
poetry new プロジェクト用フォルダ名
```

以下のようにプロジェクト用フォルダが生成します

<img width=480 src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/cbcb15bc-a721-1ffb-05b7-974180de8d18.png>

```:フォルダ内の構成
poetry-demo
├── pyproject.toml
├── README.rst
├── poetry_demo
│   └── __init__.py
└── tests
    ├── __init__.py
    └── test_poetry_demo.py
```

詳細は[後述します](https://qiita.com/c60evaporator/items/b6a7394231d1e768ce64#poetryで仮想環境作成)が、構成内の`pyproject.toml`を編集する事で、プロジェクト内のPythonやパッケージのバージョン管理、依存関係管理を実施する事ができ、Poetryにおけるパッケージ管理の中心となるファイルと言えます。

また、以下コマンドで既存のフォルダをプロジェクト用フォルダとして初期化する事もできます。

```console
cd プロジェクト用フォルダのパス
poetry init
```

作成したフォルダに以下コマンドで飛び、以降の操作を進めます

```console
cd 作成したプロジェクト用フォルダのパス
```

### pyenvでインタプリタ切替
※pyenvを使用しない場合 (**Windows使用時** or Pythonのバージョン切替が不要な場合)、**本作業は不要**です。「[・Pythonバージョンの確認](https://qiita.com/c60evaporator/items/b6a7394231d1e768ce64#pythonバージョンの確認-1)」に飛んで下さい

以下コマンドで、pyenvでインストールできるPythonのバージョンを確認します

```console
pyenv install -l
```

表示されたバージョンの中から、インストールしたいバージョンのインタプリタを選択し、以下コマンドでインストールします (既に欲しいバージョンをインストール済の場合は不要)

```console
pyenv install バージョン名
```

例えば3.11.1をインストールしたい場合、以下コマンドでインストールします

```console
pyenv install 3.11.1
```

インストール済のバージョンは、以下コマンドで確認できます

```
pyenv versions
```

以下コマンドで、プロジェクト用フォルダにPythonバージョンを反映します([参考](https://qiita.com/m3y/items/45c7be319e401b24fca8#%E7%89%B9%E5%AE%9A%E3%81%AE%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E9%85%8D%E4%B8%8B%E3%81%AE%E3%81%BF%E5%88%A9%E7%94%A8%E3%81%99%E3%82%8B%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E3%81%AE%E8%A8%AD%E5%AE%9A))
([事前に`cd プロジェクト用フォルダのパス`コマンドで該当ディレクトリに移動してください](https://qiita.com/c60evaporator/items/b6a7394231d1e768ce64#プロジェクト用フォルダの作成))

```
pyenv local バージョン名
```

以下コマンドで反映したバージョンが表示されれば成功です

```
pyenv version
```

### Pythonバージョンの確認
以下コマンドで該当フォルダの環境を表示し、目当てのPythonバージョンが表示されることを確認します

```
cd プロジェクト用フォルダのパス
python --version
```

なお、インタプリタ切替を実施したのにうまくバージョンが反映されない (システムデフォルトのPythonバージョン等が表示される)場合、基本的にはPythonのexeやpyenvにパスが通っていない事が原因の事が多いので、OS毎に以下を参考にしてください

#### ・Windowsの場合
以下コマンドでインストールされているPythonバージョンの一覧を表示します

```
py -0p
```

```:実行結果
-V:3.11 *      C:\Users\ユーザ名\AppData\Local\Programs\Python\Python311\python.exe
-V:3.10        C:\Users\ユーザ名\AppData\Local\Programs\Python\Python310\python.exe
```

[後ほどPoetryで仮想環境作成](https://qiita.com/c60evaporator/items/b6a7394231d1e768ce64#poetryで仮想環境作成)する際に、右側に記載された`C:\Users\ユーザ名\AppData\Local\Programs\Python\Python310\python.exe`のようなpython.exeのフルパスを使用するので、メモしておいてください

#### ・M1/M2 Macの場合

[前述のように](https://qiita.com/c60evaporator/items/b6a7394231d1e768ce64#pyenvへのパスの通し方)`eval "$(pyenv init -)"`コマンドでシェルにpyenvのパスを適用します

#### ・Linuxの場合

[pyenvへパスを通す](https://qiita.com/c60evaporator/items/b6a7394231d1e768ce64#pyenvへパスを通す)を実施したのち、再起動してください。

<br>

### Poetryで仮想環境作成
Poetryの`poetry env`コマンドで、仮想環境を作成します。

前準備として、pyproject.tomlを修正する必要があります。
pyproject.tomlはデフォルトでは以下のようになっています

```pyproject.toml
[tool.poetry]
name = "プロジェクト名"
version = "0.1.0"
description = ""
authors = メールアドレス等が記載される
readme = "README.md"
packages = [{include = "プロジェクト名"}]

[tool.poetry.dependencies]
python = "^3.11"


[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"
```

上記の`python = "^3.11"`の部分は、「3.11以上」を表しており、3.10のようなより低いバージョンのPythonがインストールできなくなっています。

低いバージョン、例えば3.10をインストールしたい場合、`python = "^3.10"`のように修正してください。

上記pyproject.tomlを正しく設定できたら、以下コマンドでインタプリタ切替用の環境を作成します

```console
poetry env use pythonのバージョン 
```

例えばpython3.10を使用したい場合、以下のように指定します

```console
poetry env use python3.10
```

Windowsの場合は、以下のように該当する[前述のpython.exeのフルパス](https://qiita.com/c60evaporator/items/b6a7394231d1e768ce64#windowsの場合-4)を指定する必要があります

```console
poetry env use C:\Users\ユーザ名\AppData\Local\Programs\Python\Python310\python.exe
```

<br>

## ③仮想環境にパッケージをインストール
作成した仮想環境にパッケージをインストールします

### 仮想環境のアクティベート
パッケージのインストール前に、Poetryで仮想環境を起動します

以下コマンドで、新規シェルで仮想環境を起動できます
```
cd プロジェクト用フォルダのパス
poetry shell
```

下記のようにアクティベートした環境名がシェルの最初にカッコ表示されれば成功です

```console
(環境名) [カレントフォルダ名]>
```

`exit`コマンドで、仮想環境を終了できます (似たコマンドに`decativate`がありますが、詳細は[こちら](https://cocoatomo.github.io/poetry-ja/basic-usage/#_6)を参照ください)

```console
(環境名) [カレントフォルダ名]> exit
```

※ちなみにPowerShellでアクティベートコマンドを実行すると、「このシステムではスクリプトの実行が無効になっているため、‥を読み込むことができません」というようなエラーが出ることがあります。
[こちらのリンク](https://www.python.jp/install/windows/venv.html)のように、 PowerShell のスクリプトの実行が実行ポリシーによって許可されていないことが原因なので、最初の1回のみ

```
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser -Force
```
としてあげれば、スクリプトの実行が有効となり、
`poetry shell`
としてあげれば、アクティベートされます

### パッケージのインストール
※仮想環境をアクティベートした状態からスタートしてください

下記のように`poetry add パッケージ名`で、パッケージをインストールできます

```
poetry add パッケージ名
```

例えばpandasをインストールしたい場合は以下のようになります

```
poetry add pandas
```

ここでインストールしたパッケージが、pyproject.tomlの`[tool.poetry.dependencies]`に記載されます

```toml:pyproject.tomlの一部
抜粋
:
[tool.poetry.dependencies]
python = "^3.10"
pandas = "^1.5.2"
:
抜粋
```

さらに、インストール時の依存関係が`poetry.lock`に記述されます。この`pyproject.toml`と`poetry.lock`の2つのファイルを組み合わせることで、[環境をコピー](https://qiita.com/c60evaporator/items/b6a7394231d1e768ce64#仮想環境のコピー-1)した際にも依存関係を制御する事ができます。

```poetry.lock
# This file is automatically @generated by Poetry and should not be changed by hand.

[[package]]
name = "contourpy"
version = "1.0.6"
description = "Python library for calculating contours of 2D quadrilateral grids"
category = "main"
optional = false
python-versions = ">=3.7"
files = [
    {file = "contourpy-1.0.6-cp310
:
色々と依存関係が記述される
```

`pip list`で、インストールされているパッケージのバージョンが確認できます

```console
(環境名) >pip list
Package         Version Editable project location
--------------- ------- -------------------------------------------------
numpy           1.24.1
pandas          1.5.2
pip             22.3.1
poetry-test     0.1.0   /Users/ユーザ名/Programs/Python/Test/poetry_test
python-dateutil 2.8.2
pytz            2022.7
setuptools      65.6.3
six             1.16.0
wheel           0.38.4
```

`poetry show`で、Poetryでインストールされたパッケージのみのバージョンが確認できます

```console
(環境名) >poetry show
numpy           1.24.1 Fundamental package for array computing in Python
pandas          1.5.2  Powerful data structures for data analysis, time ser...
python-dateutil 2.8.2  Extensions to the standard Python datetime module
pytz            2022.7 World timezone definitions, modern and historical
six             1.16.0 Python 2 and 3 compatibility utilities
```

## ④エディタに仮想環境を紐付ける
作成した仮想環境をエディタ(VSCode)に紐付けます

まずVSCodeで以下のようにプロジェクト用フォルダを開きます

<img width=400 src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/e9d3c6a5-4f70-6200-75cb-83ff083fca96.png>

以下のように適当な.pyファイルを作成し、右下のpythonバージョンをクリックしたのち、Poetryで作成済の仮想環境を選択します

<img width=600 src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/f97eea21-36b3-62d9-8474-e402eb6bdac4.png>

※作成した仮想環境がリストに見当たらない場合、`Enter interpreter path`をクリックして仮想環境フォルダ内のpython.exeのパスを指定します

## 【参考】その他Poetryの便利なコマンド
Poetryの以下コマンドを覚えておくと便利です

### 仮想環境のコピー
[前述の](https://qiita.com/c60evaporator/items/b6a7394231d1e768ce64#パッケージのインストール-1)pyproject.tomlおよびpoetry.lockを他のフォルダにコピーすることで、仮想環境を依存関係も含めて再現する事ができます。

まずコピー先のプロジェクト用フォルダを以下コマンドで作成します ([先ほどの新規作成時](https://qiita.com/c60evaporator/items/b6a7394231d1e768ce64#プロジェクト用フォルダの作成-1)と同様)

```console
cd プロジェクト用フォルダの上位フォルダのパス
poetry new プロジェクト用フォルダ名
```

作成したフォルダ内にコピー元のpyproject.tomlとpoetry.lockを上書き保存し、以下コマンドで依存関係も含めて仮想環境を再現する事ができます

```console
poetry install
```

該当のPythonバージョンがPC内に見つからずうまく行かない場合、[pyenvで該当のインタプリタを有効化](https://qiita.com/c60evaporator/items/b6a7394231d1e768ce64#pyenvでインタプリタ切替-1)してから再度トライしてください。

以下コマンドで環境をアクティベートし、Pythonスクリプト等を動かして環境をコピー出来ている事が確認できれば完了です

```
poetry shell
```

**依存関係も含めて環境をコピー**できるため、**venvと比べてより忠実なパッケージ環境のコピー**を実現できることが分かります

### 依存関係を無視して環境をコピー
poetry.lockをコピーせずpyproject.tomlのみをコピーして`poetry install`コマンドを実行する事で、依存関係を無視して (pyproject.tomlに記載されているパッケージのバージョンのみ再現)パッケージ環境をコピー出来ます

### パッケージのバージョン更新
以下コマンドで、pyproject.tomlに記載されている制約内でパッケージのバージョンを最新にアップデートできます。

```console
poetry update
```

### パッケージのアンインストール
以下コマンドでパッケージをアンインストールできます。

```console
poetry remove パッケージ名
```

### requirements.txtへの出力
[1.venvの場合](https://qiita.com/c60evaporator/items/b6a7394231d1e768ce64#仮想環境のコピー)と同様、仮想環境をアクティベートした状態から下記コマンドで、パッケージ構成をrequirements.txtに出力できます。

```console
(環境名) >poetry export -f requirements.txt --output requirements.txt
```

このテキストファイル内に、インストールされているパッケージ一覧が記載されています

```requirement.txt
contourpy==1.0.6
cycler==0.11.0
fonttools==4.38.0
joblib==1.2.0
kiwisolver==1.4.4
matplotlib==3.6.2
numpy==1.24.1
packaging==22.0
pandas==1.5.2
Pillow==9.3.0
# Editable install with no version control (poetry-test==0.1.0)
-e /Users/ユーザ名/Programs/Python/Test/環境名
pyparsing==3.0.9
python-dateutil==2.8.2
pytz==2022.7
scikit-learn==1.2.0
scipy==1.9.3
seaborn==0.12.2
six==1.16.0
threadpoolctl==3.1.0
```

途中の`# Editable install with no version control (poetry-test==0.1.0)`と`-e /Users/ユーザ名/Programs/Python/Test/環境名`の部分は消した方が良いでしょう。

これをDockerfile等の`pip install`コマンドの入力とする事で、本番環境にパッケージ構成を流用できます

また、以下Poetryコマンドで依存関係等も含めてrequirement.txtに出力する事もできます ([参考](https://python-poetry.org/docs/cli/#export))
(記載が長大で可読性が落ち、少しやりすぎ感もあるので、どちらを選択するかは適宜選択してください)

```
poetry export -f requirements.txt --output requirements.txt
```

### 仮想環境の一覧表示
仮想環境一覧は、以下コマンドで表示できます。
なお、ここで表示される仮想環境はPC内全ての仮想環境ではなく、あくまで現在のフォルダ内のpyproject.tomlに紐づいた仮想環境一覧のため、pyproject.tomlが置かれたフォルダ (プロジェクトのルートフォルダ)内でコマンドを実行してください。

```console
poetry env list
```

### 現在の仮想環境の詳細
現在の仮想環境の詳細を、以下コマンドで表示できます ([参考](https://python-poetry.org/docs/managing-environments/))

```
poetry env info
```

### 仮想環境の削除
仮想環境は、以下コマンドで削除できます

```
poetry env remove pythonのバージョン
```

例えばPython3.10の仮想環境を削除したい場合、以下となります

```
poetry env remove python3.10
```

現在のプロジェクト内の仮想環境を全て削除したい場合は、以下となります

```
poetry env remove --all
```

### Poetryのアンインストール

#### ・Windowsの場合
以下コマンドでアンインストールできます

```console
(Invoke-WebRequest -Uri https://install.python-poetry.org -UseBasicParsing).Content | py - --uninstall
```

[インストール時に追加した環境変数](https://qiita.com/c60evaporator/items/b6a7394231d1e768ce64#poetryのインストール)も忘れずに削除しましょう

#### ・Macの場合
[前述のように](https://qiita.com/c60evaporator/items/b6a7394231d1e768ce64#poetryのインストール-1)Homebrewでインストールしていれば、以下コマンドでアンインストールできます

```console
brew uninstall poetry
```

[pyenvへパスを通している場合](https://qiita.com/c60evaporator/items/b6a7394231d1e768ce64#pyenvへのパスの通し方)、.zshrcからも該当する3行を忘れずに削除してください

#### ・Linuxの場合
以下コマンドで、pyenvのルートフォルダを確認します (恐らく`$HOME/.pyenv`となっているはずです)

```zsh
printenv PYENV_ROOT
```

以下コマンドで、ルートフォルダを削除すればpyenvがアンインストールされます

```zsh
rm -rf pyenvのルートフォルダ
```

[pyenvへパスを通している場合](https://qiita.com/c60evaporator/items/b6a7394231d1e768ce64#pyenvへパスを通す)、.bashrcからも該当する3行を忘れずに削除してください


<br>
<br>
<br>

# 3. Conda + conda-forge
「Conda + conda-forge」による具体的なパッケージ管理手順を解説します

## ①必要ツールのインストール
[Windows](https://qiita.com/c60evaporator/items/b6a7394231d1e768ce64#windowsの場合-6), [Mac](https://qiita.com/c60evaporator/items/b6a7394231d1e768ce64#m1m2-macの場合-4), [Linux](https://qiita.com/c60evaporator/items/b6a7394231d1e768ce64#linuxubuntuの場合-2)の場合それぞれインストール方法を解説します

### Windowsの場合
インタプリタ切替＆パッケージ切替用のツールとしてCondaをインストールする必要がありますが、最も定番のAnacondaを利用すると、[Anacondaリポジトリの商用有料化](https://qiita.com/tfukumori/items/f8fc2c53077b234384fc)に引っかかってしまいます。

無料のconda-forgeリポジトリがデフォルト設定されたMiniforgeというツールを使うと、有料化を回避しつつ簡単にインストールできます。

- インタプリタ切替&パッケージ切替: Miniforgeをインストール

※なお、Miniforgeは登場して日が浅いツールのため、情報の少なさに不安のある方は[後述のMinicondaインストーラ](https://qiita.com/c60evaporator/items/b6a7394231d1e768ce64#参考minicondaインストーラによるインストール)を使用するのも良いかと思います

#### ・Miniforgeのインストール
[こちらのMiniforgeのGitHub](https://github.com/conda-forge/miniforge#download)から、Windows用のインストーラ (`Miniforge3-Windows-x86_64`と書いたリンク)をダウンロードします

ダウンロードしたexeを実行して基本的には`Next`で進めば良いですが、以下の画面のみ注意が必要です。

<img width=400 src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/1a2d990a-b728-634d-b1b4-f8e27152a788.png>

Condaを長期的にメインで使用するのであれば、基本的には`Register Miniforge3 as my default Python 3.10`をチェックしてエディタに登録した方が良いです。

また`Add Miniforge3 to my PATH environment variable`をチェックしてパスを通すとPowershell等でcondaコマンドを利用できて便利ですが、上のチェックはPowershellで常に`(base)`のようなベース仮想環境名が表示されて煩わしくもあるので、それを避けたい方は以下コマンドでスタートアップで仮想環境が起動しないようにできます

```bash
conda config --set auto_activate_base false
```

スタートメニューからMiniconda3→Anaconda Promptを開き、以下コマンドでcondaのデフォルト環境(base)上にインストールされているPythonのバージョン等の情報が表示されれば成功です

```console
conda info
```

#### ※環境名表示をOFFにする

シェルにbase環境名が表示されるのを避けたい場合、上では`conda config --set auto_activate_base false`コマンドで仮想環境の自動起動をOFFにしていました。

これ以外にも、

```bash
conda config --set changeps1 False
```

というコマンドで、環境表示を消す事ができます（入力後にターミナルの再起動が必要です）。こちらのコマンドはあくまでシェルへの`(base)`表示を消すだけで仮想環境自体は起動されるので、好みに合わせてどちらのコマンドを利用するかを選択して頂ければと思います。

#### 【参考】Minicondaインストーラによるインストール
※本稿はMiniforgeをインストールした場合は不要な操作です。

前述のようにMiniforgeの信頼性に不安がある方向けに、[先ほど紹介したMiniconda](https://qiita.com/c60evaporator/items/b6a7394231d1e768ce64#anacondaリポジトリ)をインストールした上で、リポジトリを切り替える方法も解説します。

[Minicondaのホームページ](https://docs.conda.io/en/latest/miniconda.html#windows-installers)から好きなバージョンのインストーラをダウンロードします

ダウンロードしたら基本的にはNextで進めば良いですが[Minifogeの場合と同様](https://qiita.com/c60evaporator/items/b6a7394231d1e768ce64#miniforgeのインストール)にPATHを通すかのチェックは適宜選択してください

<img width=400 src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/f90da292-f8b1-eace-4a62-4e68f02c89fa.png>

インストールが完了して再起動したら、スタートメニューからMiniconda3→Anaconda Promptをクリックします。
以下コマンドでデフォルトで使用されている

```console
conda config --show channels
```

以下のように表示されるかと思います

```console
channels:
  - defaults
```

上記の`defaults`が有料のAnacondaリポジトリを表しているので、以下コマンドでこれを削除してconda-forgeを登録します

```console
conda config --remove channels defaults
conda config --add channels conda-forge
```

再び`conda config --show channels`コマンドでリポジトリを確認し、以下のようになっていれば成功です

```console
channels:
  - conda-forge
```

<br>

### M1/M2 Macの場合
M1/M2 Macでは以下をインストールする必要があります

- インタプリタ切替&パッケージ切替: Miniforgeをインストール

#### ・Miniforgeのインストール
[こちらのMiniforgeのGitHub](https://github.com/conda-forge/miniforge#download)から、Apple Silicon用のインストーラ (`Miniforge3-MacOSX-arm64`と書いたリンク)をダウンロードします

ターミナルから以下のコマンドでダウンロードフォルダに移動し

```zsh
cd ~/Downloads
```

以下のコマンドでダウンロードしたMiniforge3-MacOSX-arm64.shを実行してください

```zsh
bash Miniforge3-MacOSX-arm64.sh
```

途中色々と聞かれますが、全てEnterを押すかyesで進んでください。
インストール完了後、シェルを一度閉じてから開き直し、以下コマンドでcondaのデフォルト環境(base)上にインストールされているPythonのバージョン等の情報が表示されれば成功です

```zsh
conda info
```

シェル実行時の最後の選択肢でnoを選択してしまってcondaコマンドが認識されない場合、以下コマンドで有効化できます

```zsh
eval "$(~/miniforge3/bin/conda shell.bash hook)"
conda init
```

[Windowsの場合](https://qiita.com/c60evaporator/items/b6a7394231d1e768ce64#miniforgeのインストール)と同様、シェルで常に`(base)`のような仮想環境名が表示されるのが煩わしい方は、以下コマンドでデフォルトでの仮想環境有効化を無効にできます

```zsh
conda config --set auto_activate_base false
```

<br>

### Linux(Ubuntu)の場合
以下をインストールする必要があります

- インタプリタ切替&パッケージ切替: Miniforgeをインストール

[こちらのMiniforgeのGitHub](https://github.com/conda-forge/miniforge#download)から、Linux用のインストーラを以下CPUに応じてダウンロードします

Intel/AMD系CPUの場合: `Miniforge3-Linux-x86_64`
Arm系CPUの場合: `Miniforge3-Linux-aarch64`

※GUIが使えない場合、以下コマンドでもダウンロードできます

```bash
wget https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-Linux-x86_64.sh
```

Intel/AMD系CPUの前提で話を進めます
ターミナルから以下のコマンドでダウンロードフォルダに移動し

```bash
cd ダウンロード先のフォルダ
```

以下のコマンドでダウンロードしたMiniforge3-Linux-x86_64.sh等を実行してください

```bash
bash Miniforge3-Linux-x86_64.sh
```

途中色々と聞かれますが、全てEnterを押すかyesで進んでください。

インストール完了後、シェルを一度閉じてから開き直し、以下コマンドでcondaのデフォルト環境(base)上にインストールされているPythonのバージョン等の情報が表示されれば成功です

```bash
conda info
```

シェル実行時の最後の選択肢でnoを選択してしまってcondaコマンドが認識されない場合、以下コマンドで有効化できます

```bash
eval "$(~/miniforge3/bin/conda shell.bash hook)"
conda init
```

[Windowsの場合](https://qiita.com/c60evaporator/items/b6a7394231d1e768ce64#miniforgeのインストール)と同様、シェルで常に`(base)`のような仮想環境名が表示されるのが煩わしい方は、以下コマンドでデフォルトでの仮想環境有効化を無効にできます

```bash
conda config --set auto_activate_base false
```

<br>

## ②仮想環境作成
プロジェクトに紐づいた仮想環境を作成します。

### プロジェクト用フォルダの作成
「1.pyenv + venv」や「2.pyenv + Poetry」ではプロジェクト用フォルダ内に仮想環境を作成しましたが、Condaではプロジェクト用フォルダとは独立に仮想環境を作成する事ができます（もちろん、プロジェクト毎に仮想環境を作成しても問題ありません）

とはいえVSCodeの操作にプロジェクト用フォルダが必要となるので、「1.pyenv + venv」の時と同様、エクスプローラやFinder、mkdirコマンド等で、下図のような感じで作成します。

<img width=400 src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/68d8f8e9-0b36-d53f-c2e6-7e7d8d75bd27.png>

作成したフォルダに以下コマンドで飛び、以降の操作を進めます

```console
cd 作成したプロジェクト用フォルダのパス
```

### Condaで仮想環境作成
[前述のように](https://qiita.com/c60evaporator/items/b6a7394231d1e768ce64#冒頭で紹介した3方法で使用しているツール)、Condaではインタプリタ(Pythonのバージョン)切替とパッケージ切替を同一のツールで実施できます。

よって「1.pyenv + venv」2.pyenv + Poetry」のように仮想環境作成前にpyenvでインタプリタを準備する必要はなく、仮想環境作成とPythonバージョン指定を同時に実行できます。
(本記事内で②の項目を比べてみると分かりますが、Pythonのバージョンを変えて仮想環境を作成したい場合、venvやPoetryを利用するよりもCondaの方が圧倒的に手間が少ないのでおすすめです)

以下コマンドで、Pythonのバージョンを指定して仮想環境を作成します

```console
conda create --name 仮想環境名 python=Pythonのバージョン
```

例えば"py39"という名称でPython3.9の仮想環境を作成したい場合、以下コマンドを実行します

```console
conda create --name py39 python=3.9
```

作成済の仮想環境は、以下コマンドで一覧表示できます。

```console
conda env list
```

```
表示例 
# conda environments:
#
base                  *  /Users/ユーザ名/miniforge3
仮想環境名                 /Users/ユーザ名/miniforge3/envs/仮想環境名
```

<br>

## ③仮想環境にパッケージをインストール
作成した仮想環境にパッケージをインストールします

### 仮想環境のアクティベート
パッケージのインストール前に、Condaで仮想環境を起動(アクティベート)します

以下コマンドで、仮想環境をアクティベートできます
```
conda activate 仮想環境名
```

下記のようにアクティベートした仮想環境名がシェルの最初にカッコ表示されれば成功です

```console
(環境名) [カレントフォルダ名]>
```

`conda deactivate`コマンドで、仮想環境を終了できます

```console
(環境名) [カレントフォルダ名]> conda deactivate
```

※なお、環境名の指定なしで`conda activate`コマンドを打つと、以下のようにベースの仮想環境(base)が有効化されます

```console
(base) [カレントフォルダ名]>
```

#### ・パッケージのインストール
※仮想環境をアクティベートした状態からスタートしてください

下記のように`conda install [パッケージ名]`で、パッケージをインストールできます

```console
(環境名) conda install パッケージ名
```

例えばpandasをインストールしたい場合は以下のようになります

```
conda install pandas
```

condaでインストールできない (conda-forgeリポジトリに存在しない)パッケージをPyPIリポジトリからインストールしたい場合、以下の`pip install`コマンドでインストール可能です

```console
(環境名) pip install パッケージ名
```

**M1/M2 Macの場合**インストール出来るPythonやパッケージのバージョンに制約があるので、詳しくは以下の記事を参照ください

https://qiita.com/c60evaporator/items/aef6cc1581d2c4676504#各種ライブラリのインストール

なお、[こちらの記事](https://qiita.com/ynakayama/items/29efebeb38604d10acef)に記載されているように、condaでインストールできる場合は基本的に**condaでインストールしてください** (特にpipとconda両方でインストールするのは避けてください)

`conda list`で、インストールされているパッケージのバージョンが確認できます

```console
(環境名) >conda list

# Name                    Version                   Build  Channel
bzip2                     1.0.8                h3422bc3_4    conda-forge
ca-certificates           2022.12.7            h4653dfc_0    conda-forge
libblas                   3.9.0           16_osxarm64_openblas    conda-forge
libcblas                  3.9.0           16_osxarm64_openblas    conda-forge
libcxx                    14.0.6               h2692d47_0    conda-forge
libffi                    3.4.2                h3422bc3_5    conda-forge
libgfortran               5.0.0           11_3_0_hd922786_27    conda-forge
libgfortran5              11.3.0              hdaf2cc0_27    conda-forge
liblapack                 3.9.0           16_osxarm64_openblas    conda-forge
libopenblas               0.3.21          openmp_hc731615_3    conda-forge
libsqlite                 3.40.0               h76d750c_0    conda-forge
libzlib                   1.2.13               h03a7124_4    conda-forge
llvm-openmp               15.0.6               h7cfbb63_0    conda-forge
ncurses                   6.3                  h07bb92c_1    conda-forge
numpy                     1.24.1                   pypi_0    pypi
openssl                   3.0.7                h03a7124_1    conda-forge
pandas                    1.5.2                    pypi_0    pypi
pip                       22.3.1             pyhd8ed1ab_0    conda-forge
python                    3.10.8          h3ba56d0_0_cpython    conda-forge
:
```

`Channel`の項にインストール元のリポジトリが表示されるので、PyPIリポジトリからインストールしたかconda-forgeリポジトリからインストールしたかを見分ける事ができます
（condaコマンドでインストールした場合も必ずconda-forgeリポジトリからインストールされるとは限らず、Pythonのバージョンや依存関係次第ではPyPIリポジトリからインストールされる事もあるようです）

### 【参考】Condaでの依存関係の管理

[Poetryでは](https://qiita.com/c60evaporator/items/b6a7394231d1e768ce64#パッケージのインストール-1)`poetry.lock`にプロジェクト一括でパッケージの依存関係が記載されましたが、Conda (Miniforge)では`~/miniforge3/pkgs/パッケージ名-バージョン-ビルド名/info/index.json`に**パッケージ毎に依存関係が記述**されます。

詳細は[公式ドキュメント](https://docs.conda.io/projects/conda/en/latest/user-guide/tasks/manage-pkgs.html#listing-package-dependencies)を参照ください

<br>

## ④エディタに仮想環境を紐付ける
作成した仮想環境をエディタ(VSCode)に紐付けます

まずVSCodeで以下のようにプロジェクト用フォルダを開きます

<img width=400 src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/e9d3c6a5-4f70-6200-75cb-83ff083fca96.png>

以下のように適当な.pyファイルを作成し、右下のpythonバージョンをクリックしたのち、Poetryで作成済の仮想環境を選択します

<img width=600 src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/68df76fc-0dfa-5438-13c1-ff26d7b96835.png>

※作成した仮想環境がリストに見当たらない場合、`Enter interpreter path`をクリックして仮想環境フォルダ内のpython.exeのパスを指定します

## 【参考】その他Condaの便利なコマンド
Condaの以下コマンドを覚えておくと便利です

### 仮想環境のコピー
を他のフォルダにコピーすることで、仮想環境を依存関係も含めて再現する事ができます。([参考](https://qiita.com/ozaki_physics/items/13466d6d1954a0afeb3b#codna-env%E3%82%92%E4%BD%BF%E3%81%86%E6%96%B9%E6%B3%95))

まずコピー元の仮想環境をアクティベートした状態で、`conda env export`コマンドで仮想環境の情報をenvironment.ymlファイルに出力します([公式ドキュメントより](https://docs.conda.io/projects/conda/en/latest/user-guide/tasks/manage-environments.html#sharing-an-environment))

```console
(環境名1) >conda env export > environment.yml
```

envorinment.ymlの中身は以下のようになっています
(dependenciesのイコールの右側のビルド名が、[前述のindex.json](https://qiita.com/c60evaporator/items/b6a7394231d1e768ce64#参考condaでの依存関係の管理)が入ったフォルダのビルド名と一致しており、ここから依存関係を特定するようです)

```environment.yml
name: 環境名
channels:
  - conda-forge
dependencies:
  - bzip2=1.0.8=h3422bc3_4
  - ca-certificates=2022.12.7=h4653dfc_0
  - libblas=3.9.0=16_osxarm64_openblas
  - libcblas=3.9.0=16_osxarm64_openblas
  - libcxx=14.0.6=h2692d47_0
  - libffi=3.4.2=h3422bc3_5
  - libgfortran=5.0.0=11_3_0_hd922786_27
  - libgfortran5=11.3.0=hdaf2cc0_27
  - liblapack=3.9.0=16_osxarm64_openblas
  - libopenblas=0.3.21=openmp_hc731615_3
  - libsqlite=3.40.0=h76d750c_0
  - libzlib=1.2.13=h03a7124_4
  - llvm-openmp=15.0.6=h7cfbb63_0
  - ncurses=6.3=h07bb92c_1
  - numpy=1.24.1=py39hefdcf20_0
  - openssl=3.0.7=h03a7124_1
  - pandas=1.5.2=py39hde7b980_0
  - pip=22.3.1=pyhd8ed1ab_0
  - python=3.9.15=hea58f1e_0_cpython
  - python-dateutil=2.8.2=pyhd8ed1ab_0
  - python_abi=3.9=3_cp39
  - pytz=2022.7=pyhd8ed1ab_0
  - readline=8.1.2=h46ed386_0
  - setuptools=65.6.3=pyhd8ed1ab_0
  - six=1.16.0=pyh6c4a22f_0
  - tk=8.6.12=he1e0b03_0
  - tzdata=2022g=h191b570_0
  - wheel=0.38.4=pyhd8ed1ab_0
  - xz=5.2.6=h57fd34a_0
prefix: /Users/ユーザ名/miniforge3/envs/環境名
```

このenvironment.ymlを他のプロジェクトフォルダに移し、以下コマンドで依存関係やインストール元リポジトリも含めて仮想環境を再現する事ができます

```console
conda env create --name 環境名2 -f environment.yml
```

### パッケージのバージョン更新
以下コマンドで、パッケージのバージョンを一括で最新にアップデートできます。

```console
conda update --all
```

以下コマンドで特定のパッケージのみをアップデート出来ます

```console
conda update パッケージ名
```

### パッケージのアンインストール
以下コマンドでパッケージをアンインストールできます。

```console
conda uninstall パッケージ名
```

### Conda本体のアップデート
Conda本体は以下コマンドでアップデート出来ます

```console
conda update -n base conda
```

### requirements.txtへの出力
[venvの場合](https://qiita.com/c60evaporator/items/b6a7394231d1e768ce64#仮想環境のコピー)と同様、仮想環境をアクティベートした状態から下記コマンドで、パッケージ構成をrequirements.txtに出力できます。

```console
(環境名) >conda list -e > requirements.txt
```

このテキストファイル内に、インストールされているパッケージ一覧が記載されています

```requirement.txt
# This file may be used to create an environment using:
# $ conda create --name <env> --file <this file>
# platform: osx-arm64
bzip2=1.0.8=h3422bc3_4
ca-certificates=2022.12.7=h4653dfc_0
libblas=3.9.0=16_osxarm64_openblas
libcblas=3.9.0=16_osxarm64_openblas
libcxx=14.0.6=h2692d47_0
libffi=3.4.2=h3422bc3_5
libgfortran=5.0.0=11_3_0_hd922786_27
libgfortran5=11.3.0=hdaf2cc0_27
liblapack=3.9.0=16_osxarm64_openblas
libopenblas=0.3.21=openmp_hc731615_3
libsqlite=3.40.0=h76d750c_0
libzlib=1.2.13=h03a7124_4
llvm-openmp=15.0.6=h7cfbb63_0
ncurses=6.3=h07bb92c_1
numpy=1.24.1=py39hefdcf20_0
openssl=3.0.7=h03a7124_1
pandas=1.5.2=py39hde7b980_0
pip=22.3.1=pyhd8ed1ab_0
python=3.9.15=hea58f1e_0_cpython
python-dateutil=2.8.2=pyhd8ed1ab_0
python_abi=3.9=3_cp39
pytz=2022.7=pyhd8ed1ab_0
readline=8.1.2=h46ed386_0
setuptools=65.6.3=pyhd8ed1ab_0
six=1.16.0=pyh6c4a22f_0
tk=8.6.12=he1e0b03_0
tzdata=2022g=h191b570_0
wheel=0.38.4=pyhd8ed1ab_0
xz=5.2.6=h57fd34a_0
```

上記のビルド名まで記載されており、少し冗長なので、[こちらの記事](https://qiita.com/katzed/items/469e4dbadeb00abab218)の方法で以下コマンドでよりシンプルな形式に変えても良いかと思います

```
conda list -e | awk -F'=' '{print $1,"==",$2}' | sed 's/ //g' | sed '/^#/d' > requirements.txt
```

```requirement.txt
bzip2==1.0.8
ca-certificates==2022.12.7
libblas==3.9.0
libcblas==3.9.0
libcxx==14.0.6
libffi==3.4.2
libgfortran==5.0.0
libgfortran5==11.3.0
liblapack==3.9.0
libopenblas==0.3.21
libsqlite==3.40.0
libzlib==1.2.13
llvm-openmp==15.0.6
ncurses==6.3
numpy==1.24.1
openssl==3.0.7
pandas==1.5.2
pip==22.3.1
python==3.9.15
python-dateutil==2.8.2
python_abi==3.9
pytz==2022.7
readline==8.1.2
setuptools==65.6.3
six==1.16.0
tk==8.6.12
tzdata==2022g
wheel==0.38.4
xz==5.2.6
```

### 仮想環境の一覧表示
[繰り返しとなりますが](https://qiita.com/c60evaporator/items/b6a7394231d1e768ce64#condaで仮想環境作成)、仮想環境一覧は以下コマンドで表示できます。

```console
conda env list
```

### 現在の仮想環境の詳細
現在の仮想環境の詳細を、仮想環境をアクティベートした状態から以下コマンドで表示できます

```
conda info
```

### 仮想環境の削除
仮想環境は、以下コマンドで削除できます

```
conda remove -n 仮想環境名 --all
```

例えばPython39という名前の仮想環境を削除したい場合、以下となります

```
conda remove -n python39 --all
```

### Condaのアンインストール

#### ・Windowsの場合
コントロールパネル→プログラムのアンインストールで、
`Miniforge3`または`Miniconda`と記載されているプログラムをアンインストールすればOKです
(念のためConda関係の[環境変数](https://qiita.com/c60evaporator/items/b6a7394231d1e768ce64#miniforgeのインストール)も削除されているか確認するのが望ましいです)

#### ・Mac/Linuxの場合
[こちらのMiniforge公式ドキュメント](https://github.com/conda-forge/miniforge#uninstallation)を参考にアンインストールを実行します。

まず以下コマンドで、シェルからcondaコマンドを無効化します

```bash
conda init --reverse --dry-run
conda init --reverse
```

次に以下コマンドで、Miniforge関係のフォルダを削除します

```bash
CONDA_BASE_ENVIRONMENT=$(conda info --base)
echo The next command will delete all files in ${CONDA_BASE_ENVIRONMENT}
rm -rf ${CONDA_BASE_ENVIRONMENT}
```

以下コマンドで、設定ファイル`.condarc`を削除します

```bash
echo ${HOME}/.condarc will be removed if it exists
rm -f "${HOME}/.condarc"
```

以上でアンインストール完了です