Соберите python-mysqlclient для mariadb-connector-c

Я пытаюсь скомпилировать python-mysqlclient с mariadb-connector-c в среде Conda. Это означает, что префикс установки не /usr/local, а, например, $HOME/conda/envs/test. Я также хочу использовать плагин auth_gssapi_client.so.

Оба пакета собираются, но import MySQLdb вызывает следующее исключение:

Traceback (most recent call last):
  File "/opt/emsconda/conda-bld/env/test_tmp/run_test.py", line 2, in <module>
    import MySQLdb
  File "/opt/emsconda/conda-bld/env/lib/python3.6/site-packages/MySQLdb/__init__.py", line 19, in <module>
    import _mysql
ImportError: libmariadb.so.3: cannot open shared object file: No such file or directory

Причина этого в том, что mysqlclient ищет только lib/, но не lib/mariadb, даже если он был настроен с правильным путем и успешно создан. Я могу обойти эту проблему, скопировав файлы *.so в lib/ (или создав символическую ссылку), но тогда он не находит подключаемый модуль GSSAPI…

Я собираю mariadb-connector-c 3.0.2 следующим образом:

mkdir build
cd build
cmake -DCMAKE_INSTALL_PREFIX=$PREFIX -DCMAKE_BUILD_TYPE=Release ..
make
make install

Я могу установить его и запустить mariadb_config, который выдает следующее:

Copyright 2011-2015 MariaDB Corporation AB
Get compiler flags for using the MariaDB Connector/C.
Usage: /opt/emsconda/conda-bld/mysqlclient_1510048680472/_h_env/bin/mariadb_config [OPTIONS]
  --cflags        [-I/opt/emsconda/conda-bld/env/include/mariadb -I/opt/emsconda/conda-bld/env/include/mariadb/mysql]
  --include       [-I/opt/emsconda/conda-bld/env/include/mariadb -I/opt/emsconda/conda-bld/env/include/mariadb/mysql]
  --libs          [-L/opt/emsconda/conda-bld/env/lib/mariadb/ -lmariadb -lpthread -ldl -lm -lssl -lcrypto]
  --libs_r        [-L/opt/emsconda/conda-bld/env/lib/mariadb/ -lmariadb -lpthread -ldl -lm -lssl -lcrypto]
  --libs_sys      [-lpthread -ldl -lm -lssl -lcrypto]
  --version       [10.2.6]
  --socket        [/tmp/mysql.sock]
  --port          [3306]
  --plugindir     [/opt/emsconda/conda-bld/env/lib/mariadb/plugin]
  --tlsinfo       [OpenSSL 1.0.2k]

Затем я собираю python-mysqlclient 1.3.12 следующим образом:

MYSQL_CONFIG="$PREFIX/bin/mariadb_config"
echo "mysql_config = $PREFIX/bin/mariadb_config" >> site.cfg
$PYTHON -m pip install -I --no-deps .

Есть два возможных решения этой проблемы:

  1. Настройте mariadb-connector-c, чтобы напрямую помещать его содержимое в lib/ — я не нашел документации о том, как это сделать.

  2. Заставить python-mysqlclient учитывать пути, возвращаемые mariadb_config — как?


person Stefan Scherfke    schedule 07.11.2017    source источник
comment
Пробовали ли вы использовать addsitedir?   -  person Zeinab Abbasimazar    schedule 07.11.2017
comment
Помогает ли это в поиске C-библиотек?   -  person Stefan Scherfke    schedule 07.11.2017
comment
Он добавляет каталог в sys.path и обрабатывает его .pth файлы по умолчанию; возможно, ваша проблема в том, что путь к вашему файлу so не указан в sys.path, поэтому модули python не могут найти его ссылку.   -  person Zeinab Abbasimazar    schedule 07.11.2017
comment
Я не думаю, что это поможет. python-mysqlclient находит .so, если он находится в lib/, но этот путь также не находится в sys.path.   -  person Stefan Scherfke    schedule 07.11.2017
comment
cmake -DCMAKE_INSTALL_PREFIX=$PREFIX -DINSTALL_LIBDIR=lib -DINSTALL_PLUGINDIR=lib/plugin -DCMAKE_BUILD_TYPE=Release .. частично решает проблему. mysqlclient теперь находит библиотеку, но не плагины.   -  person Stefan Scherfke    schedule 08.11.2017


Ответы (1)


Вы должны статически связать материал gssapi с mariadb-connector-c, и Python mysqlclient будет работать.

Вот как собрать mariadb-connector-c:

mkdir build
cd build

cmake \
    -DCMAKE_INSTALL_PREFIX=$PREFIX \
    -DINSTALL_LIBDIR=lib \
    -DINSTALL_PLUGINDIR=lib/plugin \
    -DWITH_MYSQLCOMPAT=ON \
    -DAUTH_GSSAPI=STATIC \
    -DCMAKE_BUILD_TYPE=Release \
    ..

make
make install

# WITH_MYSQLCOMPAT only creates links for the libs, not for the binary:
cd $PREFIX/bin
ln -s mariadb_config mysql_config
person Stefan Scherfke    schedule 13.11.2017