2014-12-12 1 views
0

Я пытаюсь экспортировать модель с использованием libSBML в python (2.x) в какое-то пользовательское представление, и я столкнулся с ошибкой, которую я не понимаю. Я могу получить доступ к списку видов, извлеченных из модели (self.sbSpecies), просто отлично в методе init, но попытка сделать то же самое в любом другом методе приводит к ошибке сегментации. Вот минимальный пример (требует файл 'yeast_7.11.xml' из этого архива: yest7.11):Ошибка сегментации libSBML в python за пределами __init__

#! /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 

из БГД (I Дон» знаем 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) из различных методов может привести к такому различному поведению? Как я могу его исправить (кроме выброса объектов)?

ответ

0

Мне удалось решить эту проблему, добавив себя. к sbmldoc.

Похоже, что объекты libSBML из self.sbSpecies все еще указывают на что-то в sbmldoc, но python по какой-то причине не отслеживает это и уничтожает sbmldoc, если не сказать, что этого не делать.