AWS / PHP / Python ちょいメモ

amazon web service , PHP, Python を使ったときのメモ。日本語でググってもわからなかった事を中心に。

mysqlclient / MySQL-python コンパイルエラー対処

Redhat w/SCL + pip で、Django/pythonMySQLドライバ mysqlclient / MySQL-python がインストール出来なかった対処メモ。

SCLの問題というか、Redhatrpmパッケージの考え方の問題なのかな?

# MySQL の mysqlclient と python と名前が被って若干混乱

状況と解決

pip でインストールをすると gcc が走ってコンパイルを行うのですが、どちらのドライバも同じ所で失敗してしまってました。

    gcc -pthread -shared build/temp.linux-x86_64-2.7/_mysql.o -L/opt/rh/mysql55/root/usr/lib64/mysql -L/opt/rh/python27/root/usr
/lib64 -lmysqlclient -lpthread -lz -lm -lrt -lssl -lcrypto -ldl -lpython2.7 -o build/lib.linux-x86_64-2.7/_mysql.so
    /usr/bin/ld: cannot find -lmysqlclient

mysqlclient でググルと、MySQL-develと一緒に提供があるとの情報と、libmysqlclient.so によるとある。

  • MySQL-devel パッケージは導入済み
  • コンパイル時のオプションに指定があるフォルダ (/opt/rh/mysql55/root/usr/lib64) 配下にもない

SCL頼らないところにもしかして?と思ったら /usr/lib64/mysql 配下に、ファイル libmysqlclient.so.16.0.0 があった。もしかして使えるのかなぁと、lnかけてから、ldconfig で共有ライブラリ参照キャッシュを更新。

$ sudo ln -s /usr/lib64/mysql/libmysqlclient.so.16.0.0 /usr/lib64/mysql/libmysqlclient.so
$ sudo ldconfig
$ ldconfig -p | grep libmysqlclient.so$
        libmysqlclient.so (libc6,x86-64) => /usr/lib64/mysql/libmysqlclient.so


無事、これでコンパイルが通りました!

# これを機に、 MySQL-python から mysqlclient へも乗り換え。Django settings.py の変更はなくても使えました

その他

z lib も不足してるとエラーが出てたのですが、こちらはパッケージインストールで解決。

# " cannot find -lz " は、何を指してるのか最初わからず

$ sudo yum install zlib-devel


/etc/ld.so.conf , /etc/ld.so.conf.d/ とあちこちを理解した一日でした。リリース中に遭遇っていうのが一番きつかったところ。。。

ログ

$ pip install MySQL-python
Downloading/unpacking MySQL-python
  Downloading MySQL-python-1.2.5.zip (108kB): 108kB downloaded
  Running setup.py egg_info for package MySQL-python

Installing collected packages: MySQL-python
  Running setup.py install for MySQL-python

...

    gcc -pthread -shared build/temp.linux-x86_64-2.7/_mysql.o -L/opt/rh/mysql55/root/usr/lib64/mysql -L/opt/rh/python27/root/usr
/lib64 -lmysqlclient -lpthread -lz -lm -lrt -lssl -lcrypto -ldl -lpython2.7 -o build/lib.linux-x86_64-2.7/_mysql.so
    /usr/bin/ld: cannot find -lmysqlclient
    collect2: ld はステータス 1 で終了しました
    error: command 'gcc' failed with exit status 1

...

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe3 in position 58: ordinal not in range(128)