【问题标题】:python build from source: cannot build optional module sqlite3python 从源代码构建:无法构建可选模块 sqlite3
【发布时间】:2015-12-23 03:27:05
【问题描述】:

我正在从源代码构建 python(3.5 版)以获得最新版本。我可以make python 并安装它,但是包括 _sqlite3 在内的几个“可选”模块没有安装:

$>./configure --prefix=/my/prefix && make 

产生以下结果:

...

Python 构建成功完成!

未找到构建这些可选模块的必要位:

_bz2 _lzma _sqlite3

_ssl _tkinter readline

要查找必要的位,请在 setup.py 中的 detect_modules() 中查找模块名称。

我(沮丧地)从源代码安装了 sqlite3 以确保 sqlite3 开发文件存在于某处,并且我相信我已经根据相关的 lzma module install tutorial 设置了必要的 libinclude 路径:

$> find / -name libsqlite3.so
/home/username/myproject/lib/libsqlite3.so

$> find / -name sqlite3.h
/home/username/myproject/include/sqlite3.h

$> echo $LD_LIBRARY_PATH
/home/username/myproject/lib

$> echo $LDFLAGS
-L/home/username/myproject/lib

$> echo $CFLAGS
-I/home/username/myproject/include

然而,当我运行./configure --prefix=/my/prefix --enable-loadable-sqlite-extensions && make 时,我收到了上面的错误:_sqlite3(以及其他)没有安装,因为没有找到必要的位。

基于this related answer,看来我可能需要更改setup.py?对吗?

真的没有比破解 python setup.py 脚本更好的方法了吗?

顺便说一句,我意识到用yum 安装sqlite-dev 可以解决这个问题,并将相关的sqlite3 文件放在python 安装明显的地方,但我不肯定我能做到这一点由于存储库访问受限。

【问题讨论】:

    标签: python python-3.x sqlite


    【解决方案1】:

    此链接为我构建 Python 3.5 提供了解决方案。专门针对 Ubuntu,但也帮助解决了 CentOS6 的问题。

    Install missing packages before compiling Python3

    更具体地适用于 Ubuntu 服务器 16.04:

    对于 pkg 在 build-essential zlib1g-dev libbz2-dev liblzma-dev libncurses5-dev libreadline6-dev libsqlite3-dev libssl-dev libgdbm-dev liblzma-dev tk8.5-dev lzma lzma-dev libgdbm-dev 做 apt-get -y 安装 $pkg 完毕

    【讨论】:

    • 我认为tk-dev 应该和tk8.5-dev 一样工作,但可能适用于更广泛的情况。例如,在 MXLinux 17 上,可用的 tk 版本是 8.6,安装 tk-dev 似乎对我有用。
    • 这里不需要 for 循环,只需执行 apt-get -y install build-essentials zlib1g-dev ... 并列出所有包。
    【解决方案2】:

    setup.py 脚本不会检查任何环境变量以查找sqlite3.h 文件或任何其他相关文件的位置,因此更改环境变量不足以让python 找到文件,除非sqlite3-dev 包是安装到“标准”目录中。

    以下可能用于 sqlite3 的 include 目录的 sn-p 取自 setup.py(对于 Python-3.5.0):

    sqlite_inc_paths = ['/usr/include',
                        '/usr/include/sqlite',
                        '/usr/include/sqlite3',
                        '/usr/local/include',
                        '/usr/local/include/sqlite',
                        '/usr/local/include/sqlite3',
                         ]
    

    由此可见,如果 sqlite3 未安装在“标准”系统位置,例如 /usr 或 /usr/local,则将找不到头文件。

    要解决此问题,请将/path/to/my/personal/sqlite/include 添加到上述sqlite_inc_paths 数组中:

    sqlite_inc_paths = ['/path/to/my/personal/sqlite/include',
                       ...]                          
    

    然后会找到 sqlite 模块。

    自动安装。要自动执行上述更改,可以使用 perl one 行来进行上述更改:

    $> perl -pi.orig -e "s|(?<=sqlite_inc_paths = )\[|['/path/to/my/personal/sqlite/include',\n|" setup.py
    

    sed 也可以使用,但 -i 就地标志不适用于所有系统。

    【讨论】:

      猜你喜欢
      • 2020-04-01
      • 2014-01-22
      • 2020-08-11
      • 1970-01-01
      • 2015-04-26
      • 1970-01-01
      • 2018-09-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多