Я пытаюсь скомпилировать 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 .
Есть два возможных решения этой проблемы:
Настройте mariadb-connector-c, чтобы напрямую помещать его содержимое в
lib/
— я не нашел документации о том, как это сделать.Заставить python-mysqlclient учитывать пути, возвращаемые
mariadb_config
— как?
sys.path
и обрабатывает его.pth
файлы по умолчанию; возможно, ваша проблема в том, что путь к вашему файлуso
не указан вsys.path
, поэтому модули python не могут найти его ссылку. - person Zeinab Abbasimazar   schedule 07.11.2017.so
, если он находится вlib/
, но этот путь также не находится вsys.path
. - person Stefan Scherfke   schedule 07.11.2017cmake -DCMAKE_INSTALL_PREFIX=$PREFIX -DINSTALL_LIBDIR=lib -DINSTALL_PLUGINDIR=lib/plugin -DCMAKE_BUILD_TYPE=Release ..
частично решает проблему. mysqlclient теперь находит библиотеку, но не плагины. - person Stefan Scherfke   schedule 08.11.2017