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

时间:2015-09-25 10:04:52

标签: python python-3.x sqlite

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

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

产生以下内容:

  

...

     

Python构建成功完成!

     

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

     

_bz2 _lzma _sqlite3

     

_ssl _tkinter readline

     

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

我(沮丧地)从源代码安装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脚本更好的方法吗?

顺便说一下,我意识到用sqlite-dev安装yum可以解决这个问题,并将相关的sqlite3文件放在python安装的显而易见的位置,但我并不认为我是正面的由于存储库访问受限,将能够做到这一点。

2 个答案:

答案 0 :(得分:6)

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

Install missing packages before compiling 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

答案 1 :(得分:5)

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

sqlite3的以下可能的sqlite3-dev目录片段取自include(对于Python-3.5.0):

setup.py

从那以后,很清楚如果sqlite3没有安装在"标准"系统位置,如/ usr或/ usr / local,然后将找不到头文件。

要解决此问题,请将sqlite_inc_paths = ['/usr/include', '/usr/include/sqlite', '/usr/include/sqlite3', '/usr/local/include', '/usr/local/include/sqlite', '/usr/local/include/sqlite3', ] 添加到上面的/path/to/my/personal/sqlite/include数组中:

sqlite_inc_paths

将找到sqlite模块。

自动安装。为了使上述变化自动化,可以使用perl one liner进行上述更改:

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

$> perl -pi.orig -e "s|(?<=sqlite_inc_paths = )\[|['/path/to/my/personal/sqlite/include',\n|" setup.py 也可以使用,但sed就地标志不适用于所有系统。