警告:IPython历史记录需要SQLite,您的历史记录将不会被保存

时间:2013-01-05 15:33:05

标签: python sqlite ipython pysqlite

您好我正在使用Ubuntu版本12.10(量子)32位,Linux内核3.5.0-21-通用。我正试图让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.

在第一行搜索警告时,我找到this issue report,所以我回去安装了以下内容:

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。那是我找到this 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中执行此操作。有人能指出我正确的方向吗?

5 个答案:

答案 0 :(得分:9)

  

我还在一些地方读过,我可能要重建Python。

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

答案 1 :(得分:7)

感谢minrk指出我正确的方向。我所要做的就是重建python。我已经为那些使用pythonbrew的人概述了以下步骤。请注意,我已在问题部分中安装了libsqlite3-dev包。

首先,在加载了正确版本的python和虚拟环境后,运行命令:

$ pip freeze -l > requirements.txt

这为我们提供了一个文本文件列表,其中列出了在pythonbrew中为此特定python版本安装在虚拟环境中的所有pip包。然后我们从pythonbrew中删除python的版本并重新安装它(这是“rebuild 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

并且根据this 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历史有效!

答案 2 :(得分: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 :(得分:1)

您应该使用sqlite支持重建您的python

set OWNER=myOwner
for /f %%A in ('
  powershell -nop -c "get-date -f yyyyMMdd"
') do SET "FILE_NAME=TEST_SCHEMA_%%A"
set NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1

sqlplus %OWNER%/%OWNER%@host:1521/SID @run_test.sql %OWNER% %FILE_NAME%
xcopy "\\host\c$\abc\def\test\%FILE_NAME%.*" /C

重新创建虚拟环境,你应该好好去

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

答案 4 :(得分:0)

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

pyenv uninstall 3.7
CFLAGS="-I$(xcrun --show-sdk-path)/usr/include" pyenv install 3.7