【问题标题】:Build python-mysqlclient against mariadb-connector-c针对 mariadb-connector-c 构建 python-mysqlclient
【发布时间】:2018-04-19 16:40:30
【问题描述】:

我正在尝试在 Conda 环境中针对 mariadb-connector-c 编译 python-mysqlclient。这意味着安装前缀不是/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 返回的路径 – 如何?

【问题讨论】:

  • 您是否尝试过使用addsitedir
  • 这对查找 C 库有帮助吗?
  • 默认为sys.path添加目录并处理其.pth文件;也许你的问题是你的so文件的路径没有在sys.path中列出,所以python模块找不到它的引用。
  • 我认为这不会有帮助。如果在lib/ 中,python-mysqlclient 确实找到了.so,但此路径也不在sys.path 中。
  • cmake -DCMAKE_INSTALL_PREFIX=$PREFIX -DINSTALL_LIBDIR=lib -DINSTALL_PLUGINDIR=lib/plugin -DCMAKE_BUILD_TYPE=Release .. 部分解决了这个问题。 mysqlclient 现在找到了库,但仍然没有找到插件。

标签: python mariadb mysql-python libmysql


【解决方案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

【讨论】:

    猜你喜欢
    • 2019-04-01
    • 2021-10-24
    • 2019-06-20
    • 1970-01-01
    • 2012-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-17
    相关资源
    最近更新 更多