こたつむりの備忘録

研究・技術的なことをメモしていきます

pipenvで環境構築

気づけば卒業まであと半年もないです。
せっかく自分で開発したこのプログラム、来年以降も研究室で使ってもらえるように、ドキュメントを整備することになりました。

そこで手始めに、実行するための環境構築をしていきます。
自分で開発したPythonプログラムを他の環境でも使えるようにするためには、パッケージの依存関係を書き出す必要があります。

普通であればプロジェクトごとに仮想環境作ってpip freezeなりconda env exportなりで必要なパッケージを書き出すのですが、これまで環境を分けずに適当にいろんなパッケージを入れまくってたのでどれがこのプログラムに必要なのかわからなくなっていました…
調べてみると最近はpipenvなるものが流行ってるみたいなので、AnacondaとpipでごちゃごちゃしてしまったPython環境の再構築がてらこちらに移行してみます。

(Anaconda環境の削除方法はここでは書きません。)

(2018/11/14追記) 勘違いしていたのですが、pipenvではシステム上にないpythonバージョンのビルドはしてくれません。
そこはpyenvが便利なので、結論としては pyenv + pipenvpythonの環境構築が完成するということになります
pyenvでビルドしたものは自動で探してくれるので、システム上にないバージョンが必要になった場合は、pyenvでビルドしてからpipenv installを実行すればOK。

参考:

pyenv と pipenv による python 環境 - Qiita

pipenv

pythonのバージョン管理とかパッケージ管理とか、色々あってどれ使えばいいかよくわからないですよね。
pyenv + virtualenv は導入までにやることが多くてめんどくさそうなので、 私はこれまでAnacondaを使っていました笑
Anacondaは導入は楽なんですけど、Anaconda Cloudを探しても見つからない場合はpipで入れるしかなく、Anacondaだけで完結しない上にはそれが危険だとか。

onoz000.hatenablog.com

pipenvは導入も楽だし裏でpipを使うのでパッケージが衝突することもなさそうです。

公式ドキュメント

Pipenvと仮想環境 — pipenv 2018.10.14.dev0 ドキュメント

Pipenvの基本的な使い方 — pipenv 2018.10.14.dev0 ドキュメント

Pipenvの進んだ使い方 — pipenv 2018.10.14.dev0 ドキュメント

これらに従って使っていきましょう。

install

Mac

root権限を持つローカル環境を想定

$ brew install pyenv
$ vim ~/.bashrc  # 以下3行追記
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
$ . ~/.bashrc

$ brew install pipenv

linux

root権限を持たない、リモートマシンの一般ユーザーを想定

$ git clone git://github.com/yyuu/pyenv.git ~/.pyenv
$ vim ~/.bashrc  # 以下4行追記
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
export PYTHONPATH=
$ . ~/.bashrc
$ pyenv install 3.6.7
$ pyenv global 3.6.7

$ pip install pipenv

エラーへの対処

私の場合ははじめにシステムデフォルトのpipを使って

$ pip install --user pipenv
$ pipenv install

とした時に、

Traceback (most recent call last):
  File "/usr/local/bin/pip", line 7, in <module>
    from pip._internal import main
ImportError: No module named _internal

というようなエラーが発生しました。

(恐らくですが)
pip install pipenvで、pipenvに対する依存関係としてインストールされたpipコマンドと、参照されたpipモジュールのバージョンが食い違っていたことが原因です。

以下のように対処しました

  • モジュール参照が混乱しないようにデフォルトのPYTHONPATHをクリア(export PYTHONPATH=)
  • 適当なバージョンのpythonを自分所有のディレクトリにビルド(pyenv install 3.6.7)
  • これをデフォルトに変更(pyenv global 3.6.7)

create & remove environment

先に必要となるバージョンのpythonをビルドしておきましょう。
カレントディレクトリを対象としてPythonの仮想環境が構築されます。
恐らくディレクトリ単位で環境が管理されています。
デフォルトでは実体は~/.local/share/virtualenvs/に配置されます。

$ pyenv install <VER.>
$ pipenv --python <VER.>

$ pipenv --rm

activate & deactivate

$ pipenv shell

(env_name)$ exit

install package

pipenv installpip installと完全に互換性があるそうなので、使いやすそうです。
開発環境でのみ使うものは、--devをつけてインストールします。

pipenv install chainer
pipenv install --dev jupyter

後処理として、Pipfile, Pipfile.lockを自動で更新してくれます。

Pipfileを使って環境構築

ローカルで作成したPipfileを使って、linuxのリモートサーバに必要な環境を構築してみます。
例:python2.7

on local

$ pyenv install 2.7
$ pipenv --python 2.7
$ pipenv install PKG1 PKG2 ...
$ pipenv shell
(env_name) $ ./test_script
(env_name) $ exit
$ git add .
$ git commit
$ git push

on remote

$ git clone https://github.com/hoge/hoge.git
$ cd hoge/
$ pyenv install 2.7
$ pipenv install
$ pipenv shell
(env_name) $ ./test_script
(env_name) $ exit

間違っている・勘違いしているなどあれば遠慮なく指摘してください