自分とこの環境下におけるPython使用ルール

完全に研究室のPython使用ルールとしてページを作成する．
ここで使用するpipenvについて，便利サイトを[参考](#参考)にてリンクを貼っておくので参考に．

更新履歴
2023/09/04:pyenv記述
2022/02/09:pipenv install ==と~=の説明間違いを修正
2021/07/07:学生の要望によりvenvからpipenvに変更
2021/07/06:書き始め，[anaconda使ったもの](https://qiita.com/NeK/items/7f7ac62c07e6e5d11b5f)からvenvの使用に舵をきった

# 概要
## 大枠
Python関連でaptで入れないもの(特にpipなどで入れるパッケージ)は<font color="Red">原則として各自導入(システム管理者はインストールしないものと)</font>することとする．

## Pythonとパッケージ
Pythonにはパッケージと呼ばれる沢山の便利ライブラリがある．これを必要に応じてインストール・使用することで色々なプログラムを簡単に作れる．とりあえず，「Python パッケージとは」とかで検索するとちゃんと説明文が出てくるので詳しくはそちらを参考のこと．

## 便利なパッケージの落とし穴？
複数のパッケージを入れているとパッケージ間の依存関係が強くなる．最新のバージョンにしていれば良いのではなく，古い適切なバージョンが求められる場合もある．すると，10のプロジェクト・プログラムを作成すると，それぞれに必要なパッケージをインストールすることになり，Aのプログラムではaのバージョン，Bのプログラムではbのバージョンが必要になって困る，なんてことが起こる．

またgit(GitLab，GitHub経由)でコードをcloneした場合，もとの環境でどんなパッケージをインストールしているか確認しておかなければ動かないこともある．例えば先輩がOpenAI gymのパッケージ`gym`をインストール・利用してコードを書いているとする．後輩がそのコードをもらった時に`gym`をインストールしていない or 大きく異なるバージョンを使用していると

<font color="red">「あれ？動かない，なんで？」</font>

となっていらん時間をくってしまう．

そこでプロジェクト・プログラム毎にパッケージを独立にインストール・管理することで，いらん問題を回避する．うちではpipenvを使うことでこれを実現する．

## 方針
[超初心者でもわかるPyenv, Pipenv環境構築](https://qiita.com/kkurihara_cs/items/fcac9100cb0765ee455b)
### pyenv
Python自体のバージョン管理はpyenvで．

### pipenv
パッケージ管理はpipenvで．

+ 必要なパッケージはプロジェクト・プログラムごとに導入
+ 導入したパッケージを記録しておきコードと共に管理(GitLab)
+ 他の人が使用したい場合，コードと共に記録したパッケージ情報を使用

以上の実現のために，pipenvを利用すると以下のようになる．

+ プロジェクト・プログラムごとにpipenvで仮想環境を作成
+ 仮想環境ごとに必要パッケージを導入し，仮想環境の情報(PipfileとPipfile.lock)として保持，コードと共に管理
+ 他の人が使用したい場合，PipfileやPipfile.lockから仮想環境を復元し利用

パッケージは仮想環境毎にインストールすることになるので手間がかかる一方，仮想環境間での独立性は高まる(プロジェクト・プログラムに合わせてパッケージのバージョンを自由に変えられる)．

# 準備
## もしpipを既に使っていたら
pipと混在させたくない場合，pipで入れたものをアンインストール．
やり方は[アヒルの豆知識:pipで一括”アン”インストールする方法【Python】](https://tech-market.org/python-pip-uninstall-at-once/)

あまり推奨はしない．

## pyenvのインストール・設定
### ユーザ領域にインストール．

```shell
$ curl https://pyenv.run | bash
```

### shellの設定(bash)
以下は，もし`.bashrc`, `.profile`になかったらやる．
詳しくは[公式のここ](https://github.com/pyenv/pyenv#set-up-your-shell-environment-for-pyenv)を見て行う．

```shell
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
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.profile
echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.profile
echo 'eval "$(pyenv init -)"' >> ~/.profile
```

参考
* [公式](https://github.com/pyenv/pyenv)
* [ubuntu 20.04 / 18.04 に pyenv をインストールする話](https://qiita.com/neruoneru/items/1107bcdca7fa43de673d)


## pipenvのインストール
### ubuntu 24.04以降

```shell
$ sudo apt install pipenv
```

### ubuntu 24.04以前

```shell
$ pip install pipenv 
```

### pipenvが使えない？
もし`pipenv --version`とやって「コマンドが見つかりません」など出たときにはパスが通っていない可能性がある．
シェルの設定ファイルに`~/.local/bin`を追加すること．
例えばbashの場合，`~/.bashrc`に以下を追加．

```shell
$ echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc
```

## pipenvの管理方法
パッケージはpipenv install [package_name]でインストールする．この時，自動的に(ここ大事，らくちん)インストールしたパッケージの情報をPipfileとPipfile.lockに記載する．これらのファイルを用いれば環境を簡単に復元できる．

# 具体的な流れ
## pythonの準備
### バージョン確認
```
python3 --version
```

pyenvでインストールしたもの一覧

```
pyenv versions
```

### 必要バージョンのインストール
インストールできるバージョンの確認
```
$ pyenv install -l | less
```

大抵，`3.12.7`とか．

```
$ pyenv install <version> # pyenv install 3.12.7 とか
```

### バージョン設定

```
$ pyenv global 3.12.7
$ pyenv local 3.12.7
$ pyenv shell 3.12.7
```

* global
    * 全体
* local
    * 現在のディレクトリやそれ以下のサブディレクトリ
* shell
    * 現在のシェル用
必要に応じてどれか/全部設定


## プロジェクト・プログラムの新規作成
プロジェクト・プログラムを新しく作成する場合，それに合わせた仮想環境を作成しパッケージ管理を行う．流れは以下の通り．

1. プロジェクト・プログラムのディレクトリ用意．
1. 仮想環境用意．
1. 仮想環境の有効化．
1. 普通にコーディング．必要に応じてパッケージをインストール．
1. git処理．
    * 仮想環境の情報はPipfileとPipfile.lockに自動的に保存される．
1. 以上を繰り返し．

PipfileとPipfile.lockをgit管理下に置くことが重要．

### プロジェクト・プログラムのディレクトリ用意

```shell
$ mkdir [project_dir]
$ cd [project_dir]
$ git init
あとはgitの初期設定
```

### 仮想環境用意

```shell:Python3系を指定する場合
現在[project_dir]にいる状態
$ pipenv --python 3 # Python3系
```

```shell:Pythonのバージョンを指定する場合
現在[project_dir]にいる状態
$ pipenv --python 3.6 # Python 3.6の場合
```

### 仮想環境の有効化

```shell
$ pipenv shell
```

### 普通にコーディング，必要に応じてパッケージをインストール

```shell:
現在[project_dir]にいる状態
コーディングなど
$ pipenv install [package_name]
```

バージョンを指定してインストールする場合は以下の通り．パッケージの例として `pandas` でバージョンを `0.15.0` の場合．

* `pipenv install pandas==0.15.0`
    * 0.15.0を指定．
        * 厳密には0.15.0と互換性のあるもの？
    * ~~パッケージのアップデートを防止~~
* `pipenv install pandas~=0.15.0`
    * 0.15.0を指定．
        * 厳密には0.15.0と互換性のあるもの？
    * ~~パッケージのアップデートは可~~
    * パッケージのアップデートを防止
    * 推奨の使用(らしい)

### git処理
Pipfile, Pipfile.lockは自動的に作成・更新される．よって意識して編集はしなくてよい．
gitで当該ファイルを必ず管理しておく．

## 誰かのプロジェクト・プログラムの利用
git cloneなどで持ってきた場合．

```shell
$ git clone [project_url]
[project_dir]でcloneされるとする
$ cd [project_dir]
$ pipenv install
$ pipenv shell
```

## 仮想環境の終了

```shell
$ exit
```

## その他
### 仮想環境の削除

```shell
$ cd [project_dir]
$ pipenv --rm
```

### パッケージのアップデート

```shell
$ pipenv update
```

### 移行で動かなくなったら1
新PCへの移行，Ubuntuのバージョンアップなどで動かなくなったら．

旧PCでpython3.8系を使用しており，新PCではpython3.10のみしかない場合，もともとあるプロジェクトが使用不可能になる．
その場合，一旦仮想環境を削除して作成し直し．
その際，pythonのバージョンを新しくするのか古いのを入れるのかは．．．選択

また以下のように設定をexportするなど．

`$ export SETUPTOOLS_USE_DISTUTILS=stdlib`

### 移行で動かなくなったら2
新PCへの移行，Ubuntuのバージョンアップなどで動かなくなったら．
ホームディレクトリはマウントしていて旧versionの情報が残っている場合を想定．

pipenvのもととなっているpipからバージョンアップをきちんと行う．

* [pipでアップデートするときのコマンド pip updat](https://qiita.com/HyunwookPark/items/242a8ceea656416b6da8)

pipとpipenv，それ以外もあれば．

### 移行で変なwarningがでるようになったら
PkgResourcesDeprecationWarningのwarningが出るようになったら．setuptoolsのバグっぽいので，嫌なら古いバージョンに戻しておく．

`pip install --upgrade --user setuptools==58.3.0`

* [What is the meaning of this PkgResourcesDeprecationWarning warning from pipenv --version?](https://askubuntu.com/questions/1406952/what-is-the-meaning-of-this-pkgresourcesdeprecationwarning-warning-from-pipenv)



# 参考

* [【図解】作業が倍速！pipenvの使い方【Python】](https://zenn.dev/nekoallergy/articles/py-env-pipenv01)
* [pypa/pipenv on GitHub](https://github.com/pypa/pipenv)
* [Pipenv と Pipfile.lock](https://qiita.com/propella/items/ea29d6a62fdf75f1b421)
* [Pipenvを使ったPython開発まとめ](https://qiita.com/y-tsutsu/items/54c10e0b2c6b565c887a)
* [【図で理解】PipenvによるPython仮想環境の管理](https://qiita.com/mtitg/items/3aa5e5c6d1c1cf6fd3c2)
* [Pipenvの基本的な使い方](https://pipenv-ja.readthedocs.io/ja/translate-ja/basics.html)