pythonとrubyの仮想環境
自分の仕事環境のメモ。
Ruby
結論
rbenv + bundler(Gemfile)
rbenv + rbenv-gemsetなども試したが、仮想環境のスコープではなく、rbenvのバージョン直下のgemsにgemがインストールされるので、結論はrbenv + bundlerにした。
プロジェクトの作成
$ mkdir my-project
$ cd my-projects
rubyバージョンのfix
$ rbenv local 3.0.2
#=> カレントに、.ruby-versionが作成される。
$ cat .ruby-version
3.0.2
Gemfileの作成
$ rbenv exec bundle init
#=> 空のGemfileが作成される
$ cat Gemfile
以降、このプロジェクトで使いたいgemをGemfileに書いて、その度に以下のコマンドでgemをインストールする。
インスールしたgemは、〜~/.rbenv/<rubyバージョン>/lib/ruby/gems/<rubyバージョン>/gemsにインストールされる。
$ rbenv exec bundle install
結局これも、仮想環境のスコープではなく、rbenvで指定しているrubyバージョンの下にgemが保存されるが、Railsなどでもよく慣れ親しんだ方法なので、これを利用していく。
Python
結論
pyenv + pipenv
事前に必要なものをインストール
$ sudo apt-get update
$ sudo apt-get install -y build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev xz-utils tk-dev libffi-dev liblzma-dev
pyenvのインストール
$ git clone https://github.com/pyenv/pyenv.git ~/.pyenv
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc
$ echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n eval "$(pyenv init -)"\nfi' >> ~/.zshrc
$ exec "$SHELL"
pipenvのインストール
$ pip install --user pipenv
$ echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.zshrc
$ source ~/.zshrc
pyenvで指定したバージョンのpythonをインストール
$ pyenv install 3.9.7
プロジェクトフォルダを作成して、pythonのバージョンをfix
$ mkdir hoge
$ pyenv local 3.9.7
.python-versionが作成される。rbenvと同じ。
$ cat .python-version
3.9.7
仮想環境を作成する。ちなみに仮想環境に名前を付けることはできない。名前は現在いるフォルダ名が仮想環境となる。
$ pipenv --python $(pyenv which python)
#=> Pipfileが作成されている
$ ls
Pipfile
#=> 作成された仮想環境の作成
$ ls ~/.local/share/virtualenvs
py-H90aLKcr
#=> このカレントディレクトリがどの仮想環境に紐付いているか確認。一致してる。
$ ls ~/.local/share/virtualenvs
py-H90aLKcr
必要なライブラリのインストール
$ pipenv install numpy
#=> ロックファイルが出来ている。rubyで言うGemfile.lock
$ ls
Pipfile Pipfile.loc
#=> Pipfileにもnumpyが追加されている。
$ cat Pipfile
[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"
[packages]
numpy = "*"
[dev-packages]
[requires]
python_version = "3.9"
最後に作成したフォルダで、仮想環境をアクティベート。これをしないと、Systemのpythonが参照される。
感想
Gemfileの場合は必要なgemを先にGemfileに追記して、bundle installをする。しかし、Pipfileの場合は仮想環境で、pipenv installしたものがPipfileに書かれる。手順は逆だけど、ポイントとなるファイルや、ロックファイルの構成が一緒なので解りやすい。