Pipenvでフォルダ指定した開発環境構築(mac)

プログラミング

macでpythonの開発環境を作るために、pipenv、venv、anaconda、pyenvなど初学者である私には、最初一体どれを選んだらいいのかさっぱりわかりませんでした。

しかしpipenvの依存関係にあるパッケージを取りまとめる機能や、インストール時に–devを付与することで開発環境のみにインストールするパッケージを分ける機能があることを知ってからは、pipenvを積極的に使用するようになりました。

pipenvで開発環境構築

pipenvで開発環境を作成

$ pipenv install

pipenvで作った開発環境に入る

$ pipenv shell

基本的にはこれだけです。

pipenvを使用すると、デフォルトでは以下のような位置に開発環境が作成されます。

/Users/username/.local/share/virtualenvs/ProjectName-YMi2nlbO/

usernameとProjectName-****の部分は環境によって変わります。

つまり作成するたびにvenvフォルダはプロジェクトフォルダの外部にある、一定の場所に保存されます。

Pipenvのディレクトリをプロジェクト直下にする

このフォルダの位置を変更するため、PIPENV_VENV_IN_PROJECT=1という環境変数をmacの標準シェルzshのファイル.zshrcに追加します。.zshrcはhomeディレクトリにあります。

$ vi ~/.zshrc

# 以下を追加して保存
export PIPENV_VENV_IN_PROJECT=1

# 確認
$ export -p

# 最後にこれを忘れちゃだめ
$ source ~/.zshrc

これ以降、pipenvを作成すると自動的にプロジェクト直下に.venvフォルダが追加されるようになります。

おまけ:fish shellで環境変数を保存するには

fishシェルを使って環境変数をexportしようとすると、同じようには出来ないことに気付かされます。その場合は以下のようにして設定できました。

set -Ux PIPENV_VENV_IN_PROJECT 1

set -Ux [環境変数名] [値]でセットするだけ。
以下は環境変数がいつの間にか消える問題を解決してくれたページ。🙇🏻

fishの"set -U"は環境変数に入らないよという話

Pipenv —devで開発用を分離する

pipenv install —dev [package名]でインストールすると、Pipfileの中の[dev-packages]という場所にインストールされたパッケージが記入されます。

$  pipenv install django-debug-toolbar --dev

[dev-packages]に書かれたパッケージは、pipenv install時に—devを付与した場合のみインストールされます。

[packages]
django = "*"

[dev-packages]
django-debug-toolbar = "*"

pipenvでパッケージをインストール

$ pipenv install django

pipenvでインストールすると、PipfileやPipfile.lockにパッケージの依存関係やバージョンが保存されるので、開発環境を簡単に再現できるようになります。しかし、pipでも同じようにその環境内にインストールは出来ます。

$ pip install django

この場合、PipfileやPipfile.lockには記入されないので注意が必要です。

pipでインストールしたファイルをpipenvで取り込む

ファイルに書き出し

$ pip freeze > requirements.txt

pipenvに取り込み

$ pipenv install -r ./requirements.txt

これでpipでインストールしていたパッケージもpipenvにまとめることが出来ます。

おわりに

ここまで開発環境をいろいろ考えるようになったのは、Djangoで作ったプロジェクトを実際にデプロイする段階に入ってからのことでした。ただ単にプログラムを動かすだけであればanacondaが一番楽ではないかと思います。

anacondaは初期の開発環境に自動でactivateしてくれます。だから新しく環境を作ることも、環境をactivateすることも知らずに進めることが出来ます。

しかし紆余曲折しながら自分で「開発環境とはなんぞや?」から始まり、ここまでできるようになった過程で学ぶことは多く、shellや環境変数、linuxやターミナルのことがある程度理解できるようになって良かったなと思います。

まだまだ理解できないことがとてつもなく多いプログラミング学習ですが、楽しさも感じつつあるこの頃でした。

コメント