تفشل العملية الفرعية في التقاط الإخراج القياسي
-
27-09-2019 - |
سؤال
أحاول توليد شجرة مع إدخال ملف 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
المحلول
تم إصدار Biopython 1.54 اليوم مع نسخة مستقرة من وحدة Bio.phylo. لقد قمت بتحديث الوثائق باستخدام خط أنابيب مثال لتوليد الأشجار. بالنسبة للبساطة ، يستخدم المثال Clustalw لمحاذاة التسلسلات وتوليد شجرة ، بدلاً من العضلات والفيروس ، ولكن معظم الكود لا يزال كما هو متماثل.
http://biopython.org/wiki/phylo#example_pipeline
إذا كنت قد قمت بالفعل بإنشاء شجرة مع phylip (باستخدام محاذاة .phy كمدخل) ، لا يزال بإمكانك متابعة أمثلة Phylo بشكل عام. يقوم Phylip بإنشاء ملف Newick باسم "Outtree" أو "Foo.tree".
(لا تتردد في دمج هذا بإجابة براد ؛ لا يمكنني كتابة تعليق في هذا الموضوع حتى الآن.)
نصائح أخرى
بعض الأشياء تعطي مشاكل هنا:
أنت بحاجة إلى طفل. wait () بعد مكالمة العملية الفرعية بحيث تنتظر الكود الخاص بك حتى يتم تشغيل البرنامج الخارجي.
لا تكتب Muscle فعليًا إلى stdout ، على الرغم من أن وثائق المساعدة تقول إنها تفعل ذلك ، على الأقل مع الإصدار 3.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)
من وثائق المكتبة الفرعية:
تحذير
استخدم communication () بدلاً من .stdin.write ، .stdout.read أو .stderr.Read لتجنب حالات الجمود بسبب أي من مخازن الأنابيب الأخرى التي تملأها وتمنع عملية الطفل.
لذلك ربما يمكنك تجربة شيء مثل:
mydata = child.communicate()[0]
لديك ضربة خلفية غير محمية في اسم ملف الإخراج الخاص بك ، وهذا ليس جيدًا أبدًا.
استخدم "r" للحصول على سلاسل خام ، أي r'c:\Python26\opuntia.phy'
.