2017-07-05 5 views
1

私はBio.Align.ApplicationsのMafftアライメントツールを使用しようとしています。現在、MafftCommandline()によって読み込まれた一時的なテキストファイルにシーケンス情報を書き込むことに成功しました。しかし、できるだけ冗長なステップを避けたいので、io.StringIO()を使用する代わりにメモリファイルに書き込もうとしています。これは私が問題を抱えてきた場所です。私はMafftCommandline()にio.StringIO()によって作られた内部ファイルを読み込ませることができません。内部ファイルがAlignIO.read()などの関数と互換性があることを確認しました。以下は、私のテストコードです:MafftCommandlineとio.StringIO

from Bio.Align.Applications import MafftCommandline 
from Bio import SeqIO 
from Bio.Seq import Seq 
from Bio.SeqRecord import SeqRecord 
import io 
from Bio import AlignIO 


sequences1 = ["AGGGGC", 
      "AGGGC", 
      "AGGGGGC", 
      "AGGAGC", 
      "AGGGGG"] 

longest_length = max(len(s) for s in sequences1) 
padded_sequences = [s.ljust(longest_length, '-') for s in sequences1] #padded sequences used to test compatibilty with AlignIO 

ioSeq = '' 
for items in padded_sequences: 
    ioSeq += '>unknown\n' 
    ioSeq += items + '\n' 

newC = io.StringIO(ioSeq) 
cLoc = str(newC).strip() 
cLocEdit = cLoc[:len(cLoc)] #create string to remove <and> 

test1Handle = AlignIO.read(newC, "fasta") 
#test1HandleString = AlignIO.read(cLocEdit, "fasta") #fails to interpret cLocEdit string 

records = (SeqRecord(Seq(s)) for s in padded_sequences) 

SeqIO.write(records, "msa_example.fasta", "fasta") 

test1Handle1 = AlignIO.read("msa_example.fasta", "fasta") #alignIO same for both #demonstrates working AlignIO 

in_file = '.../msa_example.fasta' 
mafft_exe = '/usr/local/bin/mafft' 

mafft_cline = MafftCommandline(mafft_exe, input=in_file) #have to change file path 
mafft_cline1 = MafftCommandline(mafft_exe, input=cLocEdit) #fails to read string (same as AlignIO) 
mafft_cline2 = MafftCommandline(mafft_exe, input=newC) 

stdout, stderr = mafft_cline() 
print(stdout) #corresponds to MafftCommandline with input file 
stdout1, stderr1 = mafft_cline1() 
print(stdout1) #corresponds to MafftCommandline with internal file 

私は、次のエラーメッセージが出ます:

のApplicationError:「は/ usr/local/binに/ 0x10f439798で< _io.StringIOオブジェクトをMAFFTからゼロ以外の戻りコード2を> '、message "/ bin/sh:-c:予期しないトークン` newline'の近くで構文エラー " ファイルパスに矢印( '<'と '>')があると考えられます。

ApplicationError: '/ usr/local/bin/mafft'からのゼロ以外の戻りコード1 '0x10f439af8' 'メッセージの/io.StringIOオブジェクト'/usr/local/bin/mafft:_io.StringIOオブジェクトを開けません0x10f439af8。 ' ファイルパスを文字列とインデックスに変換して矢印を削除しようとすると、上記のエラーが発生しました。

最終的に私の目標は、計算時間を短縮することです。別のテキストファイルに書き出すのではなく、内部メモリを呼び出すことでこれを実現したいと考えています。私の目標に関するアドバイスやフィードバックは非常に高く評価されます。前もって感謝します。

答えて

3

I can't get MafftCommandline() to read internal files made by io.StringIO().

これが理由のカップルのため驚くべきことではない:

  1. あなたが認識しているとおり、BiopythonはMAFFTを実装していない、それは単に セットアップに便利なインタフェースにmafftへの呼び出しを提供in /usr/local/binmafft実行ファイルは、Pythonプログラムの内部メモリにアクセスできない別のプロセス として実行されます。 にはStringIOファイルが含まれています。

  2. mafftプログラムは入力ファイルでのみ動作します。 でもデータソースとしてstdinを許可しません。 (stdoutは データシンクとして許可されていますが) のファイルシステムには最終的にmafftというファイルが存在する必要があります。したがって、一時ファイルの必要性。

おそらくtempfile.NamedTemporaryFile() or tempfile.mkstemp()は、妥当な妥協点かもしれません。

関連する問題