在Debian上升级Python的sqlite3

时间:2018-04-13 15:50:39

标签: python sqlite pip debian

我在Debian上的linux2上使用Python 2.7.6(默认,2014年3月22日,22:59:56)[GCC 4.8.2],我通常使用模块sqlite3而没有任何模块问题

compiled a Sqlite extension spellfix,加载时出现此错误:

  

sqlite3.OperationalError:./spellfix.so:undefined symbol:sqlite3_malloc64

我认为可能是因为sqlite3模块太旧了:

import sqlite3
print sqlite3.version          # 2.6.0
print sqlite3.sqlite_version   # 3.8.2

(在sqlite3.sqlite_version为3.8.7.x的另一台机器上,扩展加载正常)。

我试过了:

pip install --upgrade pysqlite

但它仍然相同:sqlite3.sqlite_version保持3.8.2。

如何升级Python sqlite3模块(内置于标准库中)?

2 个答案:

答案 0 :(得分:4)

您认为sqlite3的版本导致问题是正确的。 sqlite_malloc64引入了sqlite3

我建议不要尝试升级可能最终破坏Python安装的Python spellfix.c模块,而是建议编译版本3.8.2中包含的sh configure make sqlite3.c 版本。

您可以在此处找到来源:release 3.8.7

从那里你可以建立合并:

sqlite3.h

sqlite3ext.h文件夹中有tsrcspellfix.c。然后使用:

编译gcc -g -fPIC -shared spellfix.c -I ../../tsrc -o spellfix.dll 扩展名
spellfix.dll

您应该获得与您的sqlite3版本一起运行的兼容void Board::setPieceAtPosition(int index, Piece &piece) { piece.setRow(index / 8); piece.setCol(index % 8); } char Piece::convertColToLetter() { char letter = col + 49; return letter; } void Piece::display() { char colLetter = convertColToLetter(); int row = this->row + 1; if (isWhite) { std::cout << "White "; } else { std::cout << "Black "; } std::cout << name << " at " << colLetter << row << std::endl;

答案 1 :(得分:2)

这是一个手动解决方案(不推荐,但由于我没有为我的Linux安装找到libsqlite3 v3.23.1的后端,我尝试了这个,并且它有效):

  1. https://packages.debian.org/search?keywords=libsqlite3-0下载更新的版本。这是一个直接链接:

    wget http://ftp.de.debian.org/debian/pool/main/s/sqlite3/libsqlite3-0_3.23.1-1_amd64.deb
    
  2. 在。临时文件夹中解压缩.deb:

    mkdir tmp
    dpkg -x libsqlite3-0_3.23.1-1_amd64.deb tmp
    

    mkdir tmp; cd tmp; ar x ../libsqlite3-0_3.23.1-1_amd64.deb; tar xvfJ data.tar.xz; cd ..
    

    然后

    # keep the old one in case it wouldn't work!
    mv /usr/lib/x86_64-linux-gnu/libsqlite3.so.0.8.6 /usr/lib/x86_64-linux-gnu/libsqlite3.so.0.8.6.old   
    
    # copy the new one in the right place
    cp tmp/usr/lib/x86_64-linux-gnu/libsqlite3.so.0.8.6 /usr/lib/x86_64-linux-gnu/libsqlite3.so.0.8.6
    
  3. 它应该有效:

    python -c "import sqlite3; print sqlite3.sqlite_version"   # 3.23.1
    
  4. 免责声明:这有点黑客,但它确实有效。