はじめに
Python2.6はすでにサポートされなくなってしまいpip等でインストールしても動作しないのが増えてきてしまっています。
しかし悲しいことにCentOS6ではPython2.6のサポートなのでいろいろと困ってしまいます。
SCL(Software Collections)にPython2.7はいるのですが、sclを起動後、virtualenvで使おうとするとエラーが出て失敗してしまいます。
$ python --version
python: error while loading shared libraries: libpython2.7.so.1.0: cannot open shared object file: No such file or directory
で、もう少し使いやすくしよう。というので試行錯誤(?)したのが今回の方法です。
ざっくりな説明
- scl上でvirtualenv環境を作成する
- 上記で作成した仮想環境配下のbin/activateを/opt/rh/python27/enableファイルの中身を参考にして書き換える
- scl環境から抜ける
- virtualenv環境でPython2.7が使える!
そこそこな説明
sclをインストールしてsclのpython27をインストールする
この方法はあちこちあるので省略1
scl配下でvirtualenvを実行する
$ scl enable python27 "virtualenv py27"
とか
作成したvirtualenv配下のactivateを書き換える
書き換える箇所としてはPATHの書き換えているあたりの下にLD_LIBRARY_PATHとMANPATHとPKG_CONFIG_PATHを設定し、deactivate関数の中で書き換えた環境変数をもとに戻す感じ。
書き換える環境変数の内容は/opt/rh/python27/enableの中身を参照。
diffをとると以下みたいになると思う
--- py26/bin/activate
+++ py27/bin/activate
@@ -29,6 +29,21 @@
unset _OLD_VIRTUAL_PS1
fi
+ if [ -n "$_OLD_LD_LIBRARY_PATH" ] ; then
+ export LD_LIBRARY_PATH="$_OLD_LD_LIBRARY_PATH""
+ unset _OLD_LD_LIBRARY_PATH"
+ fi
+
+ if [ -n "$_OLD_MANPATH" ] ; then
+ export MANPATH="$_OLD_MANPATH"
+ unset _OLD_MANPATH
+ fi
+
+ if [ -n "$_OLD_PKG_CONFIG_PATH" ] ; then
+ export PKG_CONFIG_PATH="$_OLD_PKG_CONFIG_PATH"
+ unset _OLD_PKG_CONFIG_PATH
+ fi
+
unset VIRTUAL_ENV
if [ ! "$1" = "nondestructive" ] ; then
# Self destruct!
@@ -46,6 +61,15 @@
PATH="$VIRTUAL_ENV/bin:$PATH"
export PATH
+_OLD_LD_LIBRARY_PATH="$LD_LIBRARY_PATH"
+export LD_LIBRARY_PATH=/opt/rh/python27/root/usr/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
+
+_OLD_MANPATH="$MANPATH"
+export MANPATH=/opt/rh/python27/root/usr/share/man:${MANPATH}
+
+_OLD_PKG_CONFIG_PATH="$PKG_CONFIG_PATH"
+export PKG_CONFIG_PATH=/opt/rh/python27/root/usr/lib64/pkgconfig${PKG_CONFIG_PATH:+:${PKG_CONFIG_PATH}}
+
# unset PYTHONHOME if set
# this will fail if PYTHONHOME is set to the empty string (which is bad anyway)
# could use `if (set -u; : $PYTHONHOME) ;` in bash
実行
後はいつもと同じようにvirtualenv配下のフォルダに入ってsource bin/activateするだけでpython 2.7が動く!
おわりに
python2.7も2020年には終了しちゃうんですよね。
-
centos-release-sclとcentos-release-scl-rhの違いはなんだろう? ↩