【问题标题】:they could not be imported: _sqlite3 /Python3.6 / CentOS6无法导入:_sqlite3 /Python3.6 / CentOS6
【发布时间】:2017-05-31 18:00:11
【问题描述】:

环境

# cat /etc/redhat-release

CentOS 6.8 版(最终版)

$ which python3.6

/usr/local/bin/python3.6

# find /usr/local -name _sqlite3.so

/usr/local/lib/python2.7/lib-dynload/_sqlite3.so

# yum install sqlite-devel

当我使用 SQLite3 时,发生错误

没有名为“_sqlite3”的模块


我决定再次从源代码构建它。

# ./configure --enable-shared --prefix=/usr/local LDFLAGS="-Wl,-rpath /usr/local/lib" --with-sqlite=/usr/local/lib/python2.7/lib-dynload/_sqlite3.so

# make

Python 构建成功完成!

以下模块已成功构建但被删除,因为它们 无法导入: _sqlite3

·为什么?

【问题讨论】:

  • /usr/local/lib/python2.7/lib-dynload/_sqlite3.so 是 Python 2 Python 包装器,而不是实际的 SQLite 库。

标签: python-3.x centos


【解决方案1】:

/usr/local/lib/python2.7/lib-dynload/_sqlite3.so 是 Python 2 Python 包装模块,而不是实际的 SQLite 库。此外,--with-sqlite 应该指向 headers,而不是共享库。编译需要头文件,动态库位于运行时。

安装sqlite-devel 标头后,您不需要使用--with-sqlite;它们被放置在 Python 配置脚本知道如何找到的默认位置,在 usr/include 中。只有当您在非默认位置有标头时,您才会使用该选项指向包含 sqlite3.hsqlite3ext.h 标头的目录。

编译后,sqlite3 Python 模块会加载 _sqlite3*.so 扩展模块(确切名称与确切的 Python 3 版本和平台不同),动态加载器会找到正确的 libsqlite3.so 版本。

【讨论】:

  • 为什么在这个位置(/usr/local/lib/python3.6/lib-dynload/_sqlite3.cpython-36m-x86_64-linux-gnu_failed.所以)?
  • x86_64-linux-gnu_failed 看起来不正确。 import sysconfig; print(sysconfig.get_config_var('EXT_SUFFIX')) 说什么是您平台扩展的正确扩展?
  • @re1:另外,检查该库的依赖关系:ldd /usr/local/lib/python3.6/lib-dynload/_sqlite3.cpyth‌​on-36m-x86_64-linux-‌​gnu_failed.so 应该显示所有条目的已解析库和地址。
  • 我尝试了 print(sysconfig.get_config_var('EXT_SUFFIX'))。结果是 .cpython-36m-x86_64-linux-gnu.so。
  • @re1:那肯定可以解释为什么另一个.so 文件没有被加载。我不确定_failed 后缀来自哪里。我想您可以尝试重命名它,但请先备份。
猜你喜欢
  • 2018-09-22
  • 1970-01-01
  • 2017-09-26
  • 2019-03-11
  • 2021-12-06
  • 2017-08-03
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
相关资源
最近更新 更多