警告:IPython历史记录需要SQLite,否则您的历史记录将无法保存。

15

你好,我正在使用Ubuntu 12.10(quantal)32位版本,并搭配Linux Kernel 3.5.0-21-generic。我想让IPython的历史记录功能正常工作。我已经使用pythonbrew和虚拟环境进行了设置,并使用pip安装了IPython。目前,在终端中启动IPython时,我会得到以下提示:

WARNING: IPython History requires SQLite, your history will not be saved
Python 2.7.3 (default, Nov  8 2012, 18:25:10) 
Type "copyright", "credits" or "license" for more information.

IPython 0.13.1 -- An enhanced Interactive Python.
?         -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help      -> Python's own help system.
object?   -> Details about 'object', use 'object??' for extra details.

在第一行的警告信息上搜索,我找到了这个问题报告,于是我回去安装了以下内容:

sudo apt-get install libsqlite0 libsqlite0-dev libsqlite3-0 libsqlite3-dev

然后使用pip移除并重新安装pysqlite

pip uninstall pysqlite
pip install pysqlite

之后我想通过导入模块来检查安装:

Python 2.7.3 (default, Nov  8 2012, 18:25:10) 
[GCC 4.7.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sqlite3
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/me/.pythonbrew/pythons/Python-2.7.3/lib/python2.7/sqlite3/__init__.py", line 24, in <module>
    from dbapi2 import *
  File "/home/me/.pythonbrew/pythons/Python-2.7.3/lib/python2.7/sqlite3/dbapi2.py", line 27, in <module>
    from _sqlite3 import *
ImportError: No module named _sqlite3

现在看来无法找到文件 _sqlite3.so。我发现了这个 SO 问题。它要么不存在,要么不在我的 PYTHONPATH 环境变量中。搜索该文件,我得到:

$ locate _sqlite3.so
/home/me/Desktop/.dropbox-dist/_sqlite3.so
/home/me/epd/lib/python2.7/lib-dynload/_sqlite3.so
/usr/lib/python2.7/lib-dynload/_sqlite3.so

所以文件是存在的,但是当我查看我的Python路径时:

import sys
for p in sys.path:
    print p

在我的PYTHONPATH中没有包含任何包含_sqlite3.so的路径。为了好玩,我在终端中将路径/usr/lib/python2.7/lib-dynload添加到我的PYTHONPATH中,然后再次尝试导入sqlite3:

Python 2.7.3 (default, Nov  8 2012, 18:25:10) 
[GCC 4.7.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.path.append("/usr/lib/python2.7/lib-dynload")
>>> import sqlite3
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/me/.pythonbrew/pythons/Python-2.7.3/lib/python2.7/sqlite3/__init__.py", line 24, in <module>
    from dbapi2 import *
  File "/home/me/.pythonbrew/pythons/Python-2.7.3/lib/python2.7/sqlite3/dbapi2.py", line 27, in <module>
    from _sqlite3 import *
ImportError: /usr/lib/python2.7/lib-dynload/_sqlite3.so: undefined symbol: PyUnicodeUCS4_DecodeUTF8

哦,糟糕了。我完全卡住了。有人能帮我吗?有些地方还说我可能需要重建Python。我不知道如何在pythonbrew中做这个。有人能指导我一下吗?


你是否有使用Pythonbrew的充分理由?你可以避免这种麻烦,直接使用已经存在的Python副本。你仍然可以在其中使用虚拟环境。 - Thomas K
嗨,Thomas K。是的,我使用pythonbrew,这样我可以在电脑上保留几个不同的Python版本来测试我编写的代码。我的主要用途是检查Python 2.X和Python 3.X之间的兼容性。 - PythonJin
虽然这么想起来,我在工作中开始使用pythonbrew是因为我需要一个更新的Python版本(我相信是2.7),以便我可以使用一些新的多进程函数。在工作中,我有一个旧的Ubuntu发行版,带有Python 2.6,而我所读的所有内容都警告不要尝试升级系统版本的Python。不幸的是,升级Ubuntu不是一个选项。 - PythonJin
这很有道理。但是所有最近的 Ubuntu 版本都应该有 2.7,并且您可以轻松地同时拥有 Python 2 和 3(后者只需使用“python3”命令)。 - Thomas K
我同意。实际上,我现在遇到了第二个问题。似乎 matplotlib 在这个 pythonbrew 版本的 Python 上不会绘制图形,因为 pyGTK 没有安装,但是在 Ubuntu 中 pip 无法安装 pyGTK。看起来我又回到了原点。我逐渐开始欣赏你最初的评论了。也许我可以说服 IT 让我更新我的 Ubuntu 发行版,或者我应该选择像 EPD 这样的预打包软件。你有什么想法? - PythonJin
是的,我不会指望pip处理像PyGTK这样的东西。如果你能获取一个更新的Ubuntu版本(最新的LTS版本就可以),那可能是最好的选择。否则,使用其中一个Python发行版 - 在Scipy Stack安装页面上有一个列表。 - Thomas K
5个回答

17
我在几个地方也看到过,可能需要重建 Python。
这是正确的。SQLite 是标准库的一部分,并且在编译 Python 时进行构建。 标准库中有一些“可选”的部分,如果在构建时缺少依赖项,Python 将简单地跳过它们(遗憾的是,只有最小的警告),sqlite 就是其中之一。 您应该能够只安装 libsqlite3-dev,然后重新构建 Python,就可以解决问题。 请留意构建消息,因为它们会报告由于缺少依赖项而跳过的模块。

3
感谢你指导我正确的方向,我在其中一个答案中记录了为pythonbrew用户重建Python的过程。 - PythonJin

8
感谢minrk指导我正确的方向。我所要做的就是重建python。下面我将为那些使用pythonbrew的人概述步骤。请注意,我已经在问题部分安装了libsqlite3-dev软件包。
首先,在正确版本的python和虚拟环境加载时运行以下命令:
$ pip freeze -l > requirements.txt

这将为我们提供一个文本文件列表,其中包括在pythonbrew中针对特定Python发行版安装的所有pip软件包。然后,我们从pythonbrew中删除Python版本并重新安装它(这是“重建Python”步骤):

$ pythonbrew uninstall 2.7.3
$ pythonbrew install 2.7.3

接着,我们切换到新安装的Python版本2.7.3,并创建一个新的虚拟环境(我称之为“sci”):

$ pythonbrew switch 2.7.3
$ pythonbrew venv create sci
$ pythonbrew venv use sci

理想情况下,您应该能够运行以下命令:
$ pip install -r requirements.txt

根据这篇文章,pip应该重新安装在我们破坏那个python版本(2.7.3)之前虚拟环境中的所有模块。由于某些原因,它对我没有起作用,所以我手动逐个使用pip安装了所有模块。
$ ipython --pylab

Python 2.7.3 (default, Jan  5 2013, 18:48:27) 
Type "copyright", "credits" or "license" for more information.

IPython 0.13.1 -- An enhanced Interactive Python.
?         -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help      -> Python's own help system.
object?   -> Details about 'object', use 'object??' for extra details.

并且IPython历史记录可以工作!


1
警告:页面https://github.com/utahta/pythonbrew显示pythonbrew已不再开发。 - meduz

4

以下是我使用OSX + Homebrew + Brewed Python所采取的方法:

# Reinstall Python 2.7 with sqlite
brew remove python
brew install readline sqlite gdbm --universal
brew install python --universal --framework

# Reinstall iPython with correct bindings
pip uninstall ipython    
pip install ipython

并且你应该已经准备好了。

3

您需要重新构建支持sqlite的Python

sudo apt-get install libsqlite3-dev
wget https://www.python.org/ftp/python/2.7.15/Python-2.7.15.tgz
tar -xvf Python-2.7.15.tgz
cd Python-2.7.15
./configure
make
sudo make install

重新创建你的虚拟环境,然后你就可以继续了。
rmvirtualenv venv
mkvirtualenv -p python2 venv
workon venv
pip install -r requirements.txt
# or
pip install ipython

我认为重新安装虚拟环境并不必要,因为Python二进制文件只是符号链接。 - ryanjdillon

3
这个警告信息出现在 macOS 上,当使用 pyenv 安装 python 时,默认情况下会安装不支持 sqlite 的 python。以下命令可以重新安装带有 sqlite 支持的 python:
pyenv uninstall 3.7
CFLAGS="-I$(xcrun --show-sdk-path)/usr/include" pyenv install 3.7

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接