使用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
知道这里发生了什么吗?
答案 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)