1

我在 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

如此处所述。

当我运行开发服务器时,现在我收到“分段错误”。由于这并不能说明什么,我在 import 语句之后将settrace添加到 Django 的 manage.py 中:

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

sys.settrace(trace)

Segmentation Fault 之前的几行如下:

...
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

非常感谢任何关于可能出错的想法和一些帮助。谢谢。

4

2 回答 2

2

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

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

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

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

如何在 Python 中跟踪段错误

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

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

于 2012-09-11T11:25:53.550 回答
0

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

段错误的原因最初是通过安装 Python 包faulthander并修改我的站点manage.py以激活它来隔离到 SQLite 的,因此:

import faulthandler
faulthandler.enable()

我第一次遇到这个问题是在 MacOS 上使用旧版本的 Python(我忘记了,可能是 2.7.12 左右)。当时,通过升级到 Python 2.7.15 并重新生成 virtualenv 解决了这个问题。

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

这张 Django 票证表明旧版本的 SQLite 存在问题(我推测它与旧的 Python 发行版一起提供),并且还包含指向此 Gist的链接,该链接解释了如何将 SQLite for Python 升级到工作版本。

因此,总而言之,在带有 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. 运行本要点中描述的脚本;IE

    # 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)。

于 2018-08-29T12:42:39.457 回答