我正在从源代码构建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设置了必要的lib
和include
路径:
$> 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安装的显而易见的位置,但我并不认为我是正面的由于存储库访问受限,将能够做到这一点。
答案 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
就地标志不适用于所有系统。