ITも大抵筋肉でなんとかなる

気が向いたら技術的なことも書くかもしれないですが、技術的なこと=ITとは限りません。

pyenvとpyenv-virtualenvを導入する

概要

pyenvを導入してPython3系とPython2系を同じマシン内に同居できるようにする。

まえがき

  • Pythonは現在大きく分けて2系と3系がある
    • 2系は2.6以下と2.7以上で結構違うみたい(2系はよく知らない)
  • 今後は3系が主流になる
  • が一部ライブラリがまだ3系に対応していないことや2系を前提に動くツールが2018/10/09現在も多い
  • GNU/Linuxにデフォルトで入っている2系を削除し3系を入れるのはリスクが高い
  • そこで切り替えをコマンド1つでできるようになるpyenvを導入する
  • ついでにpyenv-virtualenvも入れる

前提モジュールのインストール

RHEL系(CentOS7など)

$ sudo yum -y groupinstall "Development Tools"
$ sudo yum -y install \
    readline-devel \
    zlib-devel \
    bzip2-devel \
    sqlite-devel \
    openssl-devel \
    libXext.x86_64 \
    libSM.x86_64 \
    libXrender.x86_64 \
    gcc \
    gcc-c++ \
    libffi-devel \
    python-devel \
    bzip2

Debian系(Ubuntuなど)

$ sudo apt-get -y install \
    gcc \
    make \
    openssl \
    libssl-dev \
    libbz2-dev \
    libreadline-dev \
    libsqlite3-dev

pyenvおよびpyenv-virtualenvのインストール

Gitからソースを取得

ディレクトリの配置先は/opt/pyenvとする。homeディレクトリ配下に配置する例もよく見るが、他のユーザから参照できない問題が発生するので/opt/pyenv配下に配置している。

$ sudo git clone https://github.com/pyenv/pyenv.git /opt/pyenv
$ sudo git clone https://github.com/pyenv/pyenv-virtualenv.git /opt/pyenv/plugins/pyenv-virtualenv
$ sudo chmod -R 777 /opt/pyenv

環境変数の設定

コマンドを使用できるように設定。

$ {
    echo export PYENV_ROOT=/opt/pyenv
    echo export PATH='$PYENV_ROOT'/bin:'$PATH'
    echo 'eval "$(pyenv init -)"'
    echo 'eval "$(pyenv virtualenv-init -)"'
} | sudo tee /etc/profile.d/pyenv.sh
$ sudo chmod 644 /etc/profile.d/pyenv.sh
$ source /etc/profile

Python本体のインストール

  • 現在(2018/10/09)の最新は3.7.0(?)なのでそれを入れる
$ pyenv install -v 3.7.0
  • pyenv installには下記のようにCFLAGSの指定も可能
$ CFLAGS="-fPIC" pyenv install -v 3.7.0

mod_wsgi使用時はCFLAGS="-fPIC"を指定しインストールしたPythonを使用しなければエラーとなる(2年ぐらい前の話なので今はどうか分からないが…)

pyenvの使用法

localオプション

  • $ pyenv local 3.7.0などとして使用する
  • 対象のディレクトリ配下のみPythonのバージョンが切り替わる
  • 対象のディレクトリ配下に.python-versionというファイルを作成するので、gitを使う場合は.gitignore.python-versionを記載しないと対象に入ってしまう(あえて入れるという手もあるが)

globalオプション

  • $ pyenv global 3.7.0などとして使用する
  • ディレクトリのPythonが指定したバージョンとなる

pyenv-virtualenvの使用法

環境を作成する

環境を作成する場合は下記のようにpyenv virtualenv {元にする環境の名称(バージョン番号)} {作成する環境の名称}とする。作成される環境は作成元の環境を引き継ぐ。つまりpipインストールで何かモジュールを入れている環境を元にした場合、作成した環境も同じものがインストールされている状態となる。

$ pyenv virtualenv 3.7.0 hoge
Requirement already satisfied: setuptools in /opt/pyenv/versions/3.7.0/envs/hoge/lib/python3.7/site-packages
Requirement already satisfied: pip in /opt/pyenv/versions/3.7.0/envs/hoge/lib/python3.7/site-packages

作成した環境を使用する

通常のpyenvと同様。

$ pyenv local hoge
(hoge) $ pyenv versions
  system
  3.7.0
* hoge (set by /hoge/fuga/.python-version)

作成した環境を削除する

こちらも通常のpyenvと同様。

$ pyenv uninstall hoge

参考

まとめ

Pythonのバージョン問題はなかなか解決しない問題で結構厄介だったりします。この方法でサクッと違うバージョンのPythonを入れておくといざというときにトラブル対処がしやすくなる…気がします。ちなみにcronで動かす場合はトラブルになりやすいので、どのPythonで動かすのかを意識した方がよいです。一番確実そうなのはPythonの実行ファイル実体をフルパスで書いてしまうことかと思います。多分。