15

嗨,我正在使用 Ubuntu 版本 12.10(量子)32 位和 Linux 内核 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 question的时候。它要么不存在,要么不在我的 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

上述包含 _sqlite3.so 的路径均未包含在我的 PYTHONPATH 中。对于傻笑,我在终端中将路径 /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 中做到这一点。谁能指出我正确的方向?

4

5 回答 5

17

我还阅读了一些我可能需要重建 Python 的地方。

这是对的。SQLite 是标准库的一部分,是在编译 Python 时构建的。标准库中有一些“可选”部分,如果在构建时缺少依赖项,Python 将简单地跳过这些部分(不幸的是,只有很少的警告),而 sqlite 就是其中之一。你应该能够只安装libsqlite3-dev,然后重建 Python,你应该已经设置好了。密切关注构建消息,因为它们会报告由于缺少依赖项而跳过了哪些模块。

于 2013-01-05T21:06:05.380 回答
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 历史有效!

于 2013-01-06T04:39:40.540 回答
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

你应该很高兴。

于 2013-11-12T11:04:00.010 回答
3

当 python 与 pyenv 一起安装时,此警告出现在 macOS 上。默认情况下,它安装没有 sqlite 的 python。这些命令重新安装带有 sqlite 支持的 python:

pyenv uninstall 3.7
CFLAGS="-I$(xcrun --show-sdk-path)/usr/include" pyenv install 3.7
于 2019-06-13T08:44:14.223 回答
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
于 2018-06-13T08:46:42.143 回答