从源代码构建python:无法构建可选模块sqlite3

hil*_*rge 5 python sqlite python-3.x

我正在从源代码构建python(版本3.5)以获取最新版本.我可以makepython并安装它,但几个"可选"模块,包括_sqlite3没有安装:

$>./configure --prefix=/my/prefix && make 
Run Code Online (Sandbox Code Playgroud)

产量如下:

...

Python构建成功完成!

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

_bz2 _lzma _sqlite3

_ssl _tkinter readline

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

我(frustratedly)安装从源代码的sqlite3也保证了存在的sqlite3地方发展的文件,我相信我已经设置了必要的libinclude路径按相关LZMA模块安装教程:

$> 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
Run Code Online (Sandbox Code Playgroud)

然而,当我跑步时./configure --prefix=/my/prefix --enable-loadable-sqlite-extensions && make,我得到上述错误_sqlite3(其中包括)未安装,因为找不到必要的位.

基于这个相关的答案,似乎我可能需要改变setup.py?那是对的吗?

有没有比黑客攻击python setup.py脚本更好的方法?

顺便说一句,我认识到,安装sqlite-devyum可能解决这个问题,并把相关的sqlite3文件复制到Python安装的地方很明显,但我不肯定,我将能够做到这一点,由于是,由于有限的资源库的访问.

小智 8

这个链接为我构建Python 3.5提供了解决方案.特别是对于Ubuntu,但也帮助计算出CentOS6.

在编译Python3之前安装缺少的包

更具体地说,对于Ubuntu服务器16.04:


for pkg in build-essential zlib1g-dev libbz2-dev liblzma-dev libncurses5-dev libreadline6-dev libsqlite3-dev libssl-dev libgdbm-devliblzma-dev tk8.5-dev lzma lzma-dev libgdbm-dev
do
    apt-get -y install $pkg
done

  • 这里不需要 for 循环,只需执行 `apt-get -y install build-essentials zlib1g-dev ...` 并列出所有软件包即可。 (3认同)
  • 我认为 `tk-dev` 应该与 `tk8.5-dev` 工作相同,但可能适用于更广泛的情况。例如,在 MXLinux 17 上,可用的 tk 版本是 8.6,安装 `tk-dev` 似乎对我有用。 (2认同)

hil*_*rge 5

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

以下include为sqlite3 的可能目录片段取自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',
                     ]
Run Code Online (Sandbox Code Playgroud)

由此可见,如果sqlite3未安装在"标准"系统位置(如/ usr或/ usr/local)中,则无法找到头文件.

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

sqlite_inc_paths = ['/path/to/my/personal/sqlite/include',
                   ...]                          
Run Code Online (Sandbox Code Playgroud)

并且将找到sqlite模块.

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

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

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