完全に研究室のPython使用ルールとしてページを作成する.
ここで使用するpipenvについて,便利サイトを参考にてリンクを貼っておくので参考に.
更新履歴
2023/09/04:pyenv記述
2022/02/09:pipenv install ==と~=の説明間違いを修正
2021/07/07:学生の要望によりvenvからpipenvに変更
2021/07/06:書き始め,anaconda使ったものからvenvの使用に舵をきった
概要
大枠
Python関連でaptで入れないもの(特にpipなどで入れるパッケージ)は原則として各自導入(システム管理者はインストールしないものと)することとする.
Pythonとパッケージ
Pythonにはパッケージと呼ばれる沢山の便利ライブラリがある.これを必要に応じてインストール・使用することで色々なプログラムを簡単に作れる.とりあえず,「Python パッケージとは」とかで検索するとちゃんと説明文が出てくるので詳しくはそちらを参考のこと.
便利なパッケージの落とし穴?
複数のパッケージを入れているとパッケージ間の依存関係が強くなる.最新のバージョンにしていれば良いのではなく,古い適切なバージョンが求められる場合もある.すると,10のプロジェクト・プログラムを作成すると,それぞれに必要なパッケージをインストールすることになり,Aのプログラムではaのバージョン,Bのプログラムではbのバージョンが必要になって困る,なんてことが起こる.
またgit(GitLab,GitHub経由)でコードをcloneした場合,もとの環境でどんなパッケージをインストールしているか確認しておかなければ動かないこともある.例えば先輩がOpenAI gymのパッケージgym
をインストール・利用してコードを書いているとする.後輩がそのコードをもらった時にgym
をインストールしていない or 大きく異なるバージョンを使用していると
「あれ?動かない,なんで?」
となっていらん時間をくってしまう.
そこでプロジェクト・プログラム毎にパッケージを独立にインストール・管理することで,いらん問題を回避する.うちではpipenvを使うことでこれを実現する.
方針
pyenv
Python自体のバージョン管理はpyenvで.
pipenv
パッケージ管理はpipenvで.
- 必要なパッケージはプロジェクト・プログラムごとに導入
- 導入したパッケージを記録しておきコードと共に管理(GitLab)
- 他の人が使用したい場合,コードと共に記録したパッケージ情報を使用
以上の実現のために,pipenvを利用すると以下のようになる.
- プロジェクト・プログラムごとにpipenvで仮想環境を作成
- 仮想環境ごとに必要パッケージを導入し,仮想環境の情報(PipfileとPipfile.lock)として保持,コードと共に管理
- 他の人が使用したい場合,PipfileやPipfile.lockから仮想環境を復元し利用
パッケージは仮想環境毎にインストールすることになるので手間がかかる一方,仮想環境間での独立性は高まる(プロジェクト・プログラムに合わせてパッケージのバージョンを自由に変えられる).
準備
もしpipを既に使っていたら
pipと混在させたくない場合,pipで入れたものをアンインストール.
やり方はアヒルの豆知識:pipで一括”アン”インストールする方法【Python】
あまり推奨はしない.
pyenvのインストール・設定
ユーザ領域にインストール.
$ curl https://pyenv.run | bash
shellの設定(bash)
以下は,もし.bashrc
, .profile
になかったらやる.
詳しくは公式のここを見て行う.
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
参考
pipenvのインストール
ubuntu 24.04以降
$ sudo apt install pipenv
ubuntu 24.04以前
$ pip install pipenv
pipenvが使えない?
もしpipenv --version
とやって「コマンドが見つかりません」など出たときにはパスが通っていない可能性がある.
シェルの設定ファイルに~/.local/bin
を追加すること.
例えばbashの場合,~/.bashrc
に以下を追加.
$ 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
- 現在のシェル用
必要に応じてどれか/全部設定
- 現在のシェル用
プロジェクト・プログラムの新規作成
プロジェクト・プログラムを新しく作成する場合,それに合わせた仮想環境を作成しパッケージ管理を行う.流れは以下の通り.
- プロジェクト・プログラムのディレクトリ用意.
- 仮想環境用意.
- 仮想環境の有効化.
- 普通にコーディング.必要に応じてパッケージをインストール.
- git処理.
- 仮想環境の情報はPipfileとPipfile.lockに自動的に保存される.
- 以上を繰り返し.
PipfileとPipfile.lockをgit管理下に置くことが重要.
プロジェクト・プログラムのディレクトリ用意
$ mkdir [project_dir]
$ cd [project_dir]
$ git init
あとはgitの初期設定
仮想環境用意
現在[project_dir]にいる状態
$ pipenv --python 3 # Python3系
現在[project_dir]にいる状態
$ pipenv --python 3.6 # Python 3.6の場合
仮想環境の有効化
$ pipenv shell
普通にコーディング,必要に応じてパッケージをインストール
現在[project_dir]にいる状態
コーディングなど
$ pipenv install [package_name]
バージョンを指定してインストールする場合は以下の通り.パッケージの例として pandas
でバージョンを 0.15.0
の場合.
-
pipenv install pandas==0.15.0
- 0.15.0を指定.
- 厳密には0.15.0と互換性のあるもの?
パッケージのアップデートを防止
- 0.15.0を指定.
-
pipenv install pandas~=0.15.0
- 0.15.0を指定.
- 厳密には0.15.0と互換性のあるもの?
パッケージのアップデートは可- パッケージのアップデートを防止
- 推奨の使用(らしい)
- 0.15.0を指定.
git処理
Pipfile, Pipfile.lockは自動的に作成・更新される.よって意識して編集はしなくてよい.
gitで当該ファイルを必ず管理しておく.
誰かのプロジェクト・プログラムの利用
git cloneなどで持ってきた場合.
$ git clone [project_url]
[project_dir]でcloneされるとする
$ cd [project_dir]
$ pipenv install
$ pipenv shell
仮想環境の終了
$ exit
その他
仮想環境の削除
$ cd [project_dir]
$ pipenv --rm
パッケージのアップデート
$ 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とpipenv,それ以外もあれば.
移行で変なwarningがでるようになったら
PkgResourcesDeprecationWarningのwarningが出るようになったら.setuptoolsのバグっぽいので,嫌なら古いバージョンに戻しておく.
pip install --upgrade --user setuptools==58.3.0