0

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

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

但是——当我通过“查找”检索时,我只能访问 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

知道这里发生了什么吗?

4

1 回答 1

0

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

一个特性的开始和结束位置从 MySQL 中检索为 long 类型(不是 int),但 SeqFeature.py 在实例化 FeatureLocation 时只期望 int 用于开始和结束。我不知道 mysql 服务器、MySQLdb、BioSeqDatabase 或 SeqFeature 发生了什么变化来引发问题。

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

  • 尝试访问 BioSeqDatabase 使用的 MySQLdb 连接,并使用其连接函数的 conv 关键字参数更改转换行为(我无法做到这一点)

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

  • hack 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)
    
于 2013-03-15T00:49:54.037 回答