pipenvで環境構築
気づけば卒業まであと半年もないです。
せっかく自分で開発したこのプログラム、来年以降も研究室で使ってもらえるように、ドキュメントを整備することになりました。
そこで手始めに、実行するための環境構築をしていきます。
自分で開発したPythonプログラムを他の環境でも使えるようにするためには、パッケージの依存関係を書き出す必要があります。
普通であればプロジェクトごとに仮想環境作ってpip freeze
なりconda env export
なりで必要なパッケージを書き出すのですが、これまで環境を分けずに適当にいろんなパッケージを入れまくってたのでどれがこのプログラムに必要なのかわからなくなっていました…
調べてみると最近はpipenvなるものが流行ってるみたいなので、AnacondaとpipでごちゃごちゃしてしまったPython環境の再構築がてらこちらに移行してみます。
(Anaconda環境の削除方法はここでは書きません。)
(2018/11/14追記)
勘違いしていたのですが、pipenvではシステム上にないpythonバージョンのビルドはしてくれません。
そこはpyenvが便利なので、結論としては pyenv + pipenv でpythonの環境構築が完成するということになります
pyenvでビルドしたものは自動で探してくれるので、システム上にないバージョンが必要になった場合は、pyenvでビルドしてからpipenv install
を実行すればOK。
参考:
pyenv と pipenv による python 環境 - Qiita
pipenv
pythonのバージョン管理とかパッケージ管理とか、色々あってどれ使えばいいかよくわからないですよね。
pyenv + virtualenv は導入までにやることが多くてめんどくさそうなので、
私はこれまでAnacondaを使っていました笑
Anacondaは導入は楽なんですけど、Anaconda Cloudを探しても見つからない場合はpipで入れるしかなく、Anacondaだけで完結しない上にはそれが危険だとか。
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 install
はpip 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
間違っている・勘違いしているなどあれば遠慮なく指摘してください