Pynote

Python、機械学習、画像処理について

環境構築 - pipenv で Python 環境の構築方法 (2018年11月版)

概要

システム標準の Python 環境は極力手を加えない方針で、プロジェクト単位で Python 及びパッケージのバージョン管理を実現する方法を紹介する。
使用するツールは以下の2つである。

  • pipenv: Python 及びパッケージのバージョン管理が行える Python 公式のツールである。
  • pyenv: 複数のバージョンの Python をインストールするのに使用する。(pipenv と連携)

使い方は以下の記事を参照されたい。

pynote.hatenablog.com

試した環境

  • 2018/11/23 確認
  • Ubuntu 16.04
  • pipenv version 2018.11.14
  • pyenv version 1.2.8

手順

1. パッケージリストを更新する。

sudo apt-get update

2. pyenv の導入

pyenv の依存ライブラリをインストールする。

sudo apt-get install -y --no-install-recommends \
    build-essential \
    curl \
    libbz2-dev \
    libffi-dev \
    liblzma-dev \
    libncurses5-dev \
    libncursesw5-dev \
    libreadline-dev \
    libsqlite3-dev \
    libssl-dev \
    llvm \
    tk-dev \
    wget \
    xz-utils \
    zlib1g-dev \
    ca-certificates \
    git \
    python-dev

pyenv を /opt 以下にインストールする。

git clone https://github.com/pyenv/pyenv.git /opt/pyenv

以下を ~/.bashrc に追記し、source ~/.bashrc で再読込する。

export PYENV_ROOT="/opt/pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"

# PATH 環境変数を操作するので、~/.bashrc の最後に記載する。
eval "$(pyenv init -)"

バージョンが表示されれば、インストールが適切にできている。

$ pyenv -v
pyenv 1.2.8

3. pipenv の導入

pipenv は最新の Python 3 上で動作させることを推奨しているため、pyenv で Python 3 をインストールし、グローバルの Python 環境に設定する。

pyenv install 3.7.1
pyenv global 3.7.1

pip で pipenv をインストールする。
自動補完を聞かせるコマンドを ~/.bashrc に追記する。

pip install pipenv
echo 'eval "$(pipenv --completion)"' >> ~/.bashrc

バージョンが表示されれば、インストールが適切にできている。

$ pipenv --version
pipenv, version 2018.11.14

Dockerfile

以上の手順を再現する Dockerfile を用意した。

github.com

トラブルシューティング

pexpect.exceptions.TIMEOUT エラー

pipenv install 中に以下のような例外が起きることがある。

Traceback (most recent call last):
  File "/opt/pyenv/versions/3.5.6/lib/python3.5/site-packages/pipenv/vendor/pexpect/expect.py", line 109, in expect_loop
    return self.timeout()
  File "/opt/pyenv/versions/3.5.6/lib/python3.5/site-packages/pipenv/vendor/pexpect/expect.py", line 82, in timeout
    raise TIMEOUT(msg)
pexpect.exceptions.TIMEOUT: <pexpect.popen_spawn.PopenSpawn object at 0x7f9aaa97c438>
searcher: searcher_re:
    0: re.compile('\n')

During handling of the above exception, another exception occurred:

これは pipenv が virtualenv の生成を待機するリミット PIPENV_TIMEOUT (デフォルト120秒) を経過しても virtualenv の生成が完了していないことが原因である。
対策として、PIPENV_TIMEOUT を 120 より大きい値に設定すればよい。

# リミットを10分に変更する。
export PIPENV_TIMEOUT=600 && pipenv install