python源代码:无法生成可选模块sqlite3

nfg76nw0  于 2023-10-21  发布在  Python
关注(0)|答案(2)|浏览(107)

我正在从源代码构建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脚本更好的方法了吗?
顺便说一下,我意识到安装sqlite-devyum可以解决这个问题,并将相关的sqlite3文件放在python安装的明显位置,但我不确定我能够做到这一点,因为有限的存储库访问。

z18hc3ub

z18hc3ub1#

这个链接为我构建Python 3.5提供了解决方案。特别是Ubuntu,但也帮助CentOS 6解决了这个问题。
Install missing packages before compiling Python3
对于Ubuntu Server 16.04:

for pkg in 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
do
    apt-get -y install $pkg
done
wnvonmuf

wnvonmuf2#

setup.py脚本不会检查任何环境变量来确定sqlite3.h文件或任何其他相关文件的位置,因此,除非sqlite3-dev包安装到“标准”目录中,否则更改环境变量不足以让python找到这些文件。
以下sqlite3的include目录片段取自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 liner来执行上述更改:

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

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

相关问题