2013-03-04 58 views
0

在Ubuntu 12.10上运行Python 2.7,最新的BioPython和BioSQL。DBSeqRecord无法在BioPython下使用BioSQL访问注释和功能

我已经成功建立了基于MySQL的BioSQL服务器,并且我可以正确地将序列加载到系统中(或者它们看起来是正确的 - 在MySQL中正确填充表并且事情通常没有错误)。

但是,当我通过'lookup'检索时,我只能访问DBSeqRecords的ID,名称和描述。应该根据需求调用注释和功能,但这会使事情崩溃。例如:

File "/usr/lib/pymodules/python2.7/Bio/SeqRecord.py", line 595, in __str__ 
    lines.append("Number of features: %i" % len(self.features)) 
    File "/usr/lib/pymodules/python2.7/BioSQL/BioSeq.py", line 516, in __get_features 
    self._primary_id) 
    File "/usr/lib/pymodules/python2.7/BioSQL/BioSeq.py", line 280, in _retrieve_features 
    feature.location = SeqFeature.FeatureLocation(start, end) 
    File "/usr/lib/pymodules/python2.7/Bio/SeqFeature.py", line 561, in __init__ 
    raise TypeError(start) 
TypeError: 0 

任何想法这里发生了什么?

回答

0

本周我遇到了同样的错误。

一个要素的开始和结束位置是从MySQL获取的,类型为long(不是int),但SeqFeature.py在实例化FeatureLocation时仅为开始和结束使用int。我不知道在MySQL服务器,MySQLdb,BioSeqDatabase或SeqFeature中发生了什么变化,以引发问题。

的biopython开发商希望一会能提供一个长期的解决方案,但这些都是暂时的修正建议:

  • 试图去通过BioSeqDatabase使用MySQLdb的连接,并改变与转换行为它的连接功能的conv关键字参数(我还没有做到这一点)

  • hack BioSeqDatabase,以便在从MySQL获取值(我没有这样做)之后,start_pos和end_pos被转换为int,

  • 对SeqFeature.py进行破解以允许在实例化FeatureLocation对象时使用长类型来开始和结束(这是我所做的)。更改此:

    if isinstance(start, AbstractPosition): 
        self._start = start 
    elif isinstance(start, int): 
        self._start = ExactPosition(start) 
    else: 
        raise TypeError(start) 
    if isinstance(end, AbstractPosition): 
        self._end = end 
    elif isinstance(end, int): 
        self._end = ExactPosition(end) 
    else: 
        raise TypeError(end) 
    

    这样:

    if isinstance(start, AbstractPosition): 
        self._start = start 
    elif isinstance(start, int) or isinstance(start, long): 
        self._start = ExactPosition(start) 
    else: 
        raise TypeError(start) 
    if isinstance(end, AbstractPosition): 
        self._end = end 
    elif isinstance(end, int) or isinstance(end, long): 
        self._end = ExactPosition(end) 
    else: 
        raise TypeError(end)