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は実際にはstdoutに書き込みません。少なくとも、ここにあるv3.6では書き込みを行います。最新はv3.8だと思うので、これは修正される可能性があります。

Biopythonは、渡したstdoutが空であることを通知しています。これは、表示されているエラーです。コマンドラインを直接実行してみてください。

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

サブプロセスライブラリのドキュメントから:

警告

.stdin.write、.stdout.read、または.stderr.readではなくcommunicate()を使用して、他の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モジュールの安定バージョンとともに本日リリースされました。ツリーを生成するためのパイプラインの例を使用してドキュメントを更新しました。簡単にするために、この例では、MuscleとPhylipの代わりに、ClustalWを使用してシーケンスを整列し、ツリーを生成しますが、ほとんどのコードは同じか類似しています。

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

(入力として.phyアライメントを使用して)Phylipを使用してツリーを既に生成している場合でも、一般的なPhyloの例に従うことができます。Phylipは、「outttree」や「foo.tree」などの名前のNewickファイルを作成します。

(これをブラッドの答えと自由にマージしてください。そのスレッドにはまだコメントを書くことができません。)

于 2010-05-21T06:26:27.003 に答える