2013-03-04 46 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)