エンジニアの頭の中

フリーランスエンジニアが書く技術系ブログです。

Python3で使用するMySQL用ライブラリのインストールしようとした時の問題

f:id:mitsu3204:20170815173648j:plain

Python3からMySQLを使用するため、mysqlclientをインストールしようとしたのですが、OSError: mysql_config not foundだのIndexError: string index out of rangeだのと、エラーが発生して苦労したので、メモを残しておきます。

環境情報

作業内容

ライブラリ選定

pythonmysql用ライブラリはいくつか存在しますが、どのライブラリも特に決定打となるような点も無いようなので、とりあえず、Python3に対応しているmysqlclientを使おうと決めました。

mysqlclientのインストールしようとして失敗

mysqlclientをpipでインストールしようとしたところ、以下のようなエラーが出ました。

$ pip install mysqlclient
Collecting mysqlclient
  Using cached mysqlclient-1.3.10.tar.gz
    Complete output from command python setup.py egg_info:
    /bin/sh: mysql_config: command not found
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "/private/var/folders/vf/1vzq715d34gb5rd58qmb2bv80000gn/T/pip-build-umfa1hq7/mysqlclient/setup.py", line 17, in <module>
        metadata, options = get_config()
      File "/private/var/folders/vf/1vzq715d34gb5rd58qmb2bv80000gn/T/pip-build-umfa1hq7/mysqlclient/setup_posix.py", line 44, in get_config
        libs = mysql_config("libs_r")
      File "/private/var/folders/vf/1vzq715d34gb5rd58qmb2bv80000gn/T/pip-build-umfa1hq7/mysqlclient/setup_posix.py", line 26, in mysql_config
        raise EnvironmentError("%s not found" % (mysql_config.path,))
    OSError: mysql_config not found

    ----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in /private/var/folders/vf/1vzq715d34gb5rd58qmb2bv80000gn/T/pip-build-umfa1hq7/mysqlclient/

mysql-connector-cをインストール

OSError: mysql_config not foundで、mysql_configが無いと言われています。 で、ググった結果、mysql-connector-cをインストールすれば解決すると知り、Homebrewでmysql-connector-cをインストールします。

$ brew install mysql-connector-c

こちらは、無事にインストール完了しました。インストールしたmysql_configのバージョンは、6.1.11です。 これで、mysql_configが使えるようになります。

$ mysql_config
Usage: /usr/local/bin/mysql_config [OPTIONS]
Options:
        --cflags         [-I/usr/local/Cellar/mysql-connector-c/6.1.11/include ]
        --cxxflags       [-I/usr/local/Cellar/mysql-connector-c/6.1.11/include ]
        --include        [-I/usr/local/Cellar/mysql-connector-c/6.1.11/include]
        --libs           [-L/usr/local/Cellar/mysql-connector-c/6.1.11/lib -l ]
        --libs_r         [-L/usr/local/Cellar/mysql-connector-c/6.1.11/lib -l ]
        --plugindir      [/usr/local/Cellar/mysql-connector-c/6.1.11/lib/plugin]
        --socket         [/tmp/mysql.sock]
        --port           [0]
        --version        [6.1.11]
        --variable=VAR   VAR is one of:
                pkgincludedir [/usr/local/Cellar/mysql-connector-c/6.1.11/include]
                pkglibdir     [/usr/local/Cellar/mysql-connector-c/6.1.11/lib]
                plugindir     [/usr/local/Cellar/mysql-connector-c/6.1.11/lib/plugin]

異なるエラーが発生して、mysqlclientのインストールに失敗

改めて、mysqlclientをインストールしようとしたところ、今度はまた異なるエラーが発生しました。

$ pip install mysqlclient
Collecting mysqlclient
  Using cached mysqlclient-1.3.10.tar.gz
    Complete output from command python setup.py egg_info:
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "/private/var/folders/vf/1vzq715d34gb5rd58qmb2bv80000gn/T/pip-build-mz9gtse9/mysqlclient/setup.py", line 17, in <module>
        metadata, options = get_config()
      File "/private/var/folders/vf/1vzq715d34gb5rd58qmb2bv80000gn/T/pip-build-mz9gtse9/mysqlclient/setup_posix.py", line 54, in get_config
        libraries = [dequote(i[2:]) for i in libs if i.startswith('-l')]
      File "/private/var/folders/vf/1vzq715d34gb5rd58qmb2bv80000gn/T/pip-build-mz9gtse9/mysqlclient/setup_posix.py", line 54, in <listcomp>
        libraries = [dequote(i[2:]) for i in libs if i.startswith('-l')]
      File "/private/var/folders/vf/1vzq715d34gb5rd58qmb2bv80000gn/T/pip-build-mz9gtse9/mysqlclient/setup_posix.py", line 12, in dequote
        if s[0] in "\"'" and s[0] == s[-1]:
    IndexError: string index out of range

    ----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in /private/var/folders/vf/1vzq715d34gb5rd58qmb2bv80000gn/T/pip-build-mz9gtse9/mysqlclient/

今度は、IndexError: string index out of rangeとか言われています。

mysql_configを修正

この問題は、既にGIthubにissueが挙がっていました。

github.com

解決方法を提示されていたので、それに従い、mysql_configを書き換えます。

$ which mysql_config
/usr/local/bin/mysql_config
$ vim /usr/local/bin/mysql_config

mysql_configの114行目に記載されているlibsの値を以下の通りに書き換えます。

変更前

libs="$libs -l "

変更後

libs="$libs -lmysqlclient -lssl -lcrypto"

再度mysqlclientをインストールを実行、そして成功

再度インストールを実行したところ、今度は成功しました。

$ pip install mysqlclient
Collecting mysqlclient
  Using cached mysqlclient-1.3.10.tar.gz
Installing collected packages: mysqlclient
  Running setup.py install for mysqlclient ... done
Successfully installed mysqlclient-1.3.10

動作確認

動作確認として、PythonからMySQLサーバに接続して、show tablesでテーブルの一覧を表示させてみました。 正常に動作しました。

import MySQLdb

conn = MySQLdb.connect(
        user='ユーザー'名,
        password='パスワード',
        host='DBホスト名',
        db='データベース名')
cur = conn.cursor()
cur.execute('show tables')
print(cur.fetchone())

これで作業完了になります。