pysqlite分段错误?

时间:2012-09-11 11:17:35

标签: python segmentation-fault homebrew pysqlite django-manage.py

我在OSX 10.6上并且最近将我的Python从2.6升级到2.7,所以我不得不升级python包。

这次我决定使用brew并使用brew安装sqlite,libspatialite和spatialite-tools,brew doctor说一切正常。当我启动本地开发服务器(Django 1.4)时,它抱怨现有的pysqlite不支持扩展加载(这是SpatiaLite所需)。

然后我下载了pysqlite-2.6.3,解压缩,进行配置更改以启用扩展加载,然后执行:

python setup.py build_static
python setup.py install

here所述。

当我运行开发服务器时,现在我收到了“分段错误”。由于这并没有说明多少,我在导入语句之后向Django的manage.py添加了settrace

def trace(frame, event, arg):
    print "%s, %s:%d" % (event, frame.f_code.co_filename, frame.f_lineno)
    return trace

sys.settrace(trace)

分段错误之前的几行如下:

...
call, /Users/omat/workspace/devspaces/env/lib/python2.7/site-packages/django/db/backends/sqlite3/base.py:71
line, /Users/omat/workspace/devspaces/env/lib/python2.7/site-packages/django/db/backends/sqlite3/base.py:71
call, /Users/omat/workspace/devspaces/env/lib/python2.7/encodings/utf_8.py:15
line, /Users/omat/workspace/devspaces/env/lib/python2.7/encodings/utf_8.py:16
return, /Users/omat/workspace/devspaces/env/lib/python2.7/encodings/utf_8.py:16
return, /Users/omat/workspace/devspaces/env/lib/python2.7/site-packages/django/db/backends/sqlite3/base.py:71
Segmentation fault

对于可能出现的问题和一些帮助的任何想法都非常感谢。感谢。

2 个答案:

答案 0 :(得分:2)

很可能你有一个与你的Python混合的不兼容的SQLite或Python SQLite本机绑定库。

在Python升级后重新安装问题中的所有包。

如果你想完全避免这样的问题,我建议使用托管环境安装Python,SQLite和Python绑定,其中所有软件包都来自同一个源,例如Homebrew。

如果在此环境之外手动安装软件包,请确保在编译本机库时使用正确的Python库和Python标头。即如果您使用Homebrew中的库,请使用Homebrew提供的Python和Python头文件,而不是OSX默认值。

如何在Python中跟踪段错误

http://wiki.python.org/moin/DebuggingWithGdb

这将告诉您实际问题以及问题中失败的个别库。

答案 1 :(得分:0)

最近(2018年),我在各种系统环境中使用新创建的Python virtualenv遇到了此问题。

首先通过安装Python软件包faulthander并修改我站点的manage.py来激活它,从而将段故障的原因隔离到SQLite上,从而

import faulthandler
faulthandler.enable()

我第一次遇到此问题是在使用较旧版本的Python的MacOS上(我忘记了,大概是2.7.12)。那时,通过升级到Python 2.7.15并重新生成virtualenv可以解决该问题。

接下来是运行Python 2.7.5的Ubuntu 14.04。认为这是由于我将旧版本的Ubuntu升级到16.04和Python 2.7.12所致,但问题仍然存在。在这种情况下,我想坚持使用Python的标准发行版安装。

This Django ticket提出了旧版本的SQLite(我推测是旧版本的Python发行版)存在的问题,并且还包含指向this Gist的链接,该链接说明了如何将适用于Python的SQLite升级为正常工作版本。

因此,总而言之,在具有Python 2.7.12的Ubuntu 16.04上:

  1. 安装必备软件包:

    sudo apt-get install python-dev
    sudo apt-get install libsqlite3-dev
    
  2. 创建并激活新的Python virtualenv。

  3. 创建并转到工作目录;例如

    mkdir ~/sqlite
    cd ~/sqlite
    
  4. 运行this Gist中描述的脚本;即

    # install custom sqlite 3.14
    wget https://github.com/ghaering/pysqlite/archive/2.8.3.tar.gz
    wget https://www.sqlite.org/2016/sqlite-autoconf-3140100.tar.gz
    tar -xzvf sqlite-autoconf-3140100.tar.gz
    tar -xzvf 2.8.3.tar.gz
    cp -av sqlite-autoconf-3140100/. pysqlite-2.8.3/
    cd ./pysqlite-2.8.3 && python setup.py build_static install
    

在这一点上,我能够安装我的软件并运行测试而没有任何问题(嗯,没有我自己的问题:-o)。