MafftCommandline和io.StringIO

MafftCommandline和io.StringIO,io,bioinformatics,biopython,Io,Bioinformatics,Biopython,我一直在尝试使用Bio.Align.Applications中的Mafft对齐工具。目前,我已经成功地将序列信息写入临时文本文件,然后由MafftCommandline()读取。但是,我希望尽可能避免重复步骤,因此我一直在尝试使用io.StringIO()来写入内存文件。这就是我遇到问题的地方。我无法让MafftCommandline()读取io.StringIO()生成的内部文件。我已经确认内部文件与AlignIO.read()等函数兼容。以下是我的测试代码: from Bio.Align.A

我一直在尝试使用Bio.Align.Applications中的Mafft对齐工具。目前,我已经成功地将序列信息写入临时文本文件,然后由MafftCommandline()读取。但是,我希望尽可能避免重复步骤,因此我一直在尝试使用io.StringIO()来写入内存文件。这就是我遇到问题的地方。我无法让MafftCommandline()读取io.StringIO()生成的内部文件。我已经确认内部文件与AlignIO.read()等函数兼容。以下是我的测试代码:

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
从Bio.Align.Applications导入MafftCommandline
来自Bio import SeqIO
从生物序列导入序列
从Bio.SeqRecord导入SeqRecord
输入io
从Bio导入AlignIO
sequences1=[“agggc”,
“AGGGC”,
“aggggc”,
“AGAGC”,
“agggg”]
最长长度=最大值(序列1中s的长度)
填充的_序列=[s.ljust(sequences1中的s的最长_长度“-”)#用于测试与AlignIO的兼容性的填充序列
ioSeq=''
对于填充_序列中的项目:
ioSeq+='>未知\n'
ioSeq+=项目+'\n'
newC=io.StringIO(ioSeq)
cLoc=str(newC).strip()
cLocEdit=cLoc[:len(cLoc)]#创建要删除的字符串<和>
test1Handle=AlignIO.read(newC,“fasta”)
#test1HandleString=AlignIO.read(cLocEdit,“fasta”)#无法解释cLocEdit字符串
记录=(填充_序列中s的SeqRecord(Seq(s)))
SeqIO.write(记录,“msa_示例.fasta”,“fasta”)
test1Handle1=AlignIO.read(“msa_example.fasta”,“fasta”)#AlignIO两者相同#演示工作对齐
在_文件='…/msa_example.fasta'
mafft_exe='/usr/local/bin/mafft'
mafft_cline=MafftCommandline(mafft_exe,input=in_file)#必须更改文件路径
mafft_cline1=MafftCommandline(mafft_exe,input=cLocEdit)#无法读取字符串(与AlignIO相同)
mafft_cline2=MafftCommandline(mafft_exe,输入=newC)
stdout,stderr=mafft_cline()
打印(标准输出)#对应于带有输入文件的MAFFTCOMANDLINE
stdout1,stderr1=mafft_cline1()
打印(stdout1)#对应于带有内部文件的MafftCommandline
我收到以下错误消息:

ApplicationError:来自“/usr/local/bin/mafft”消息“/bin/sh”的非零返回代码2:-c:第0行:意外标记“newline”附近的语法错误 我相信这是由于文件路径中存在箭头(“”)

ApplicationError:来自“/usr/local/bin/mafft”\u io.StringIO对象位于0x10f439af8”的非零返回代码1,消息“/usr/local/bin/mafft:无法打开\u io.StringIO对象位于0x10f439af8” 试图通过将文件路径转换为字符串和索引来删除箭头,导致上述错误

最终我的目标是减少计算时间。我希望通过调用内部内存而不是写入单独的文本文件来实现这一点。非常感谢您对我的目标提出的任何建议或反馈。提前谢谢

我无法让MafftCommandline()读取由生成的内部文件 io.StringIO()

出于以下几个原因,这并不奇怪:

  • 正如您所知,Biopython并没有实现Mafft,它只是 提供一个方便的界面,用于在中设置对
    mafft
    的调用
    /usr/local/bin
    mafft
    可执行文件作为单独的进程运行 无法访问Python程序的内部内存, 包括您的StringIO文件

  • mafft程序只适用于输入文件,甚至不适用于 允许
    stdin
    作为数据源。(尽管它允许
    stdout
    作为 所以最终,文件系统中必须有一个文件 使
    mafft
    打开。因此需要您的临时文件

  • 也许这是一个合理的妥协