サブプロセスは標準出力をキャッチできません
-
27-09-2019 - |
質問
MusclecommandlineとのFASTAファイル入力と整合でツリーを生成しようとしています
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
解決
Biopython 1.54は本日、bio.phyloモジュールの安定したバージョンでリリースされました。木を生成するためのパイプラインの例でドキュメントを更新しました。簡単にするために、この例では、ClustAlwを使用してシーケンスを調整し、筋肉やPhylipの代わりにツリーを生成しますが、ほとんどのコードは依然として同じまたは類似しています。
http://biopython.org/wiki/phylo#example_pipeline
すでにPhylipを使用してツリーを生成している場合(入力として.Phyアライメントを使用)、一般的なPhyloの例に従うことができます。 Phylipは、「Outttree」や「foo.tree」などの名前を持つNewickファイルを作成します。
(これをブラッドの答えとお気軽に融合してください。まだそのスレッドにコメントを書くことはできません。)
他のヒント
ここでいくつかのことが問題を抱えています:
サブプロセスの呼び出し後にchild.wait()が必要で、外部プログラムが実行されるまでコードが待機するようにします。
ヘルプドキュメントでは、少なくとも私がここに持っているv3.6では、筋肉は実際にはstdoutに書くことはありません。最新は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)
のドキュメントから サブプロッケスライブラリ:
警告
.stdin.write、.stdout.read、または.stderr.readではなくcommunication()を使用して、他のOSパイプバッファーが補充して子プロセスをブロックしているためにデッドロックを避けます。
だから多分あなたは次のようなことを試すことができます:
mydata = child.communicate()[0]
出力ファイル名に保護されていないバックスラッシュがありますが、それは決して良いことではありません。
「r」を使用して生の文字列を取得します。 r'c:\Python26\opuntia.phy'
.