DBSeqRecord无法使用BioPython下的BioSQL访问注释和功能

时间:2013-03-04 16:47:11

标签: biopython

使用Python 2.7,最新的BioPython和BioSQL在Ubuntu 12.10上运行。

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

然而 - 当我通过'lookup'检索时,我只能访问DBSeqRecords的id,name和description。应该按需调用注释和功能,但这会使事情崩溃。例如:

 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

知道这里发生了什么吗?

1 个答案:

答案 0 :(得分:0)

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

功能的开始和结束位置从MySQL检索为long(非int)类型,但SeqFeature.py仅在实例化FeatureLocation时期望int为start和end。我不知道在mysql服务器,MySQLdb,BioSeqDatabase或SeqFeature中发生了什么变化都引发了这个问题。

希望其中一个biopython开发人员能够提供长期解决方案,但这些是临时修复的建议:

  • 尝试使用BioSeqDatabase使用的MySQLdb连接,并使用其connect函数的conv关键字参数更改转换行为(我无法执行此操作)

  • 破解BioSeqDatabase,以便在从MySQL获取值后将start_pos和end_pos转换为int(我还没有这样做)

  • hack SeqFeature.py在实例化FeatureLocation对象时允许long类型的开始和结束(这就是我所做的)。改变这个:

    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)