1

我正在尝试使用 fasta 文件输入和与 MuscleCommandline 对齐来生成树

import sys,os, subprocess
from Bio import AlignIO
from Bio.Align.Applications import MuscleCommandline
cline = MuscleCommandline(input="c:\Python26\opuntia.fasta")
child= subprocess.Popen(str(cline),
                         stdout = subprocess.PIPE,
                         stderr=subprocess.PIPE,
                        shell=(sys.platform!="win32"))
align=AlignIO.read(child.stdout,"fasta")
outfile=open('c:\Python26\opuntia.phy','w')
AlignIO.write([align],outfile,'phylip')
outfile.close()

我总是遇到这些问题

Traceback (most recent call last):
  File "<string>", line 244, in run_nodebug
  File "C:\Python26\muscleIO.py", line 11, in <module>
    align=AlignIO.read(child.stdout,"fasta")
  File "C:\Python26\Lib\site-packages\Bio\AlignIO\__init__.py", line 423, in read
    raise ValueError("No records found in handle")
ValueError: No records found in handle
4

4 回答 4

4

这里有一些问题:

  1. 在子进程调用之后您需要一个 child.wait() ,以便您的代码将等到外部程序完成运行。

  2. Muscle 实际上并没有写入标准输出,即使帮助文档说它确实如此,至少对于我这里的 v3.6。我相信最新的是 v3.8,所以这可能会被修复。

Biopython 告诉您您传递的标准输出是空的,这是您看到的错误。尝试直接运行命令行:

muscle -in opuntia.fasta

看看你是否看到 FASTA 输出。这是一个修复等待问题并使用中间输出文件的版本:


import sys,os, subprocess
from Bio import AlignIO
from Bio.Align.Applications import MuscleCommandline
out_file = "opuntia.aln"
cline = MuscleCommandline(input="opuntia.fasta", out=out_file)
child= subprocess.Popen(str(cline),
                         stdout = subprocess.PIPE,
                         stderr=subprocess.PIPE,
                        shell=(sys.platform!="win32"))
child.wait()
with open(out_file) as align_handle:
    align=AlignIO.read(align_handle,"fasta")
outfile=open('opuntia.phy','w')
AlignIO.write([align],outfile,'phylip')
outfile.close()
os.remove(out_file)

于 2010-05-18T13:49:28.367 回答
2

子进程库的文档中:

警告

使用communicate() 而不是.stdin.write、.stdout.read 或.stderr.read 以避免由于任何其他OS 管道缓冲区填满并阻塞子进程而导致的死锁。

所以也许你可以尝试类似的东西:

mydata = child.communicate()[0]
于 2010-05-18T11:52:38.167 回答
1

您的输出文件名中有一个未受保护的反斜杠,这绝不是好事。

使用 'r' 获取原始字符串,即r'c:\Python26\opuntia.phy'.

于 2010-05-18T11:25:46.490 回答
0

Biopython 1.54 今天发布了一个稳定版本的 Bio.Phylo 模块。我已经使用用于生成树的示例管道更新了文档。为简单起见,示例使用 ClustalW 对齐序列并生成树,而不是 Muscle 和 Phylip,但大部分代码仍然相同或相似。

http://biopython.org/wiki/Phylo#Example_pipeline

如果您已经使用 Phylip 生成了一个树(使用 .phy 对齐作为输入),您仍然可以按照一般的 Phylo 示例进行操作。Phylip 创建一个名为“outttree”或“foo.tree”的 Newick 文件。

(请随意将其与布拉德的答案合并;我还不能在该线程中写评论。)

于 2010-05-21T06:26:27.003 回答