libSBML 分段错误在 Python 之外__init__

libSBML segmentation fault in python outside __init__

本文关键字:之外 init Python 分段 错误 libSBML      更新时间:2023-10-16

我正在尝试使用 python (2.x) 中的 libSBML 将模型导出到一些自定义表示中,但我遇到了一个我不明白的错误。我可以在 init 方法中很好地访问从模型 (self.sbSpecies) 中提取的物种列表,但尝试在任何其他方法中执行相同的操作会导致分割错误。这是最小的示例(需要此存档中的"yeast_7.11.xml"文件:yest7.11):

#! /usr/bin/env python
from libsbml import *
class Exporter(object):
    def __init__(self, path_to_file):
        reader = SBMLReader()
        sbmldoc = reader.readSBMLFromFile(path_to_file)
        self.sbModel = sbmldoc.getModel()
        self.sbSpecies = [x for x in self.sbModel.getListOfSpecies()]
        print 'init:', self.sbSpecies[0]
    def debug(self):
        print 'debug:', self.sbSpecies[0]
exporter = Exporter('yeast_7.11.xml')
species = exporter.debug()

尝试运行它给了我:

$ ./minimal_example.py 
init: <Species s_0001 "(1->3)-beta-D-glucan [cell envelope]">
Segmentation fault

来自 gdb(我不懂 C 或 C++,所以我无法真正破译发生了什么)

(gdb) run ./minimal_example.py
Starting program: /usr/bin/python ./minimal_example.py
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
init: <Species s_0001 "(1->3)-beta-D-glucan [cell envelope]">
Program received signal SIGSEGV, Segmentation fault.
0x00007ffff5ebffe0 in ?? () from /usr/lib/python2.7/dist-packages/libsbml/_libsbml.so
(gdb) backtrace
#0  0x00007ffff5ebffe0 in ?? () from /usr/lib/python2.7/dist-packages/libsbml/_libsbml.so
#1  0x0000000000502be0 in PyObject_CallFunction ()
#2  0x00000000004f8aa9 in _PyObject_GenericGetAttrWithDict ()
#3  0x00000000004ce145 in ?? ()
#4  0x00000000004cd95f in ?? ()
#5  0x000000000052c6d5 in PyEval_EvalFrameEx ()
#6  0x000000000056d0aa in ?? ()
#7  0x00000000004d9854 in ?? ()
#8  0x00000000004da29f in PyEval_CallObjectWithKeywords ()
#9  0x0000000000599269 in ?? ()
#10 0x00000000005165dc in PyObject_Str ()
#11 0x00000000005b52e3 in ?? ()
#12 0x000000000051694b in PyFile_WriteObject ()
#13 0x000000000052ffdd in PyEval_EvalFrameEx ()
#14 0x000000000052cf32 in PyEval_EvalFrameEx ()
#15 0x000000000055c594 in PyEval_EvalCodeEx ()
#16 0x00000000005b7392 in PyEval_EvalCode ()
#17 0x0000000000469663 in ?? ()
#18 0x00000000004699e3 in PyRun_FileExFlags ()
#19 0x0000000000469f1c in PyRun_SimpleFileExFlags ()
#20 0x000000000046ab81 in Py_Main ()
#21 0x00007ffff7817ec5 in __libc_start_main () from /lib/x86_64-linux-gnu/libc.so.6
#22 0x000000000057497e in _start ()

知道为什么从不同的方法访问相同的对象(self.sbSpecies列表)会导致如此不同的行为吗?我该如何修复它(除了扔掉物体)?

我设法通过添加 self 来解决这个问题。 到 sbmldoc。

似乎来自self.sbSpecies的libSBML对象仍然指向sbmldoc中的某些内容,但是由于某种原因,python不会跟踪它并破坏sbmldoc,除非被告知不要这样做。