環境
Ubuntu16.04
pyenv
[pyenv]はいろいろなpythonのバージョンを切り分けられる便利なツール.公式にサポートされているvenvがライブラリの切り分けツールとしてはスタンダートなのだろうが,なんだかんだ言って任意のバージョンをとってこれたり,pyenv localなどが使えるのは結構便利で使っている.
pipenvもpythonの自動インストールにはpyenvを利用している.
しかしpyenvはpythonをビルドするので,ちゃんとビルドに必要なツールがそろっている必要がある.ここでsudoがないと公式チュートリアルに従えない.
具体的には
sudo apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev \
libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev \
xz-utils tk-dev libffi-dev liblzma-dev
が推奨されているが,sudoがないとpyenvが自動的に見つけてくれるデフォルトの位置にライブラリを配置できない.
自分の場合
WARNING: The Python bz2 extension was not compiled. Missing the bzip2 lib?
WARNING: The Python readline extension was not compiled. Missing the GNU readline lib?
WARNING: The Python sqlite3 extension was not compiled. Missing the SQLite3 lib?
なるエラーが出てきてしまい.最初は無視していたが,jupyter notebookを使うときに,sqlite3関連のエラーが出てきて困ってしまった.
解決策
https://github.com/pyenv/pyenv/issues/333
を参考に,ライブラリを書き込み権限がある場所において,パスを通してセットアップするようにした.
まずライブラリを以下のような手順で書き込み権限のあるところでビルドする.
apt-get source {package_name}
cd {package_folder}
./configure --prefix={インストール用のパス}
make
make install
自分はlibbz2-dev libreadline-dev libsqlite3-dev
の三つを入れたら大丈夫だった.
configureがない場合もあるので,その場合はMakefileのprefixを直接いじる.bzipはmakefileしかなかった.
以上のようにして必要なライブラリを好きな場所でビルドすれば以下のような手順でpythonをpyenvでビルドできるようになる.
PYTHON_CONFIGURE_OPTS="LDFLAGS=-L{インストール用のパス}/lib CFLAGS=-L{インストール用のパス}/include CPPF
LAGS=-L{インストール用のパス}/include" pyenv install 3.5.6
PYTHON_CONFIGURE_OPTSを適宜設定することで,コンパイラーに渡すオプションを変えることができるようだ.このようにしてやると,自前の環境にビルドしたライブラリもpyenvが見つけることができるようになるのだろう.
以上のような手順を踏むことで,sqlite3などが使えるpythonが使えるようになった.