Вам может не понравиться этот ответ, но я думаю, что он правильный.Не меняйте место назначения stdout, если это не является абсолютно необходимым (может быть, вы используете библиотеку, которая выводит только stdout - здесь явно не так).
Я думаю, что хорошей привычкой вы должны подготовить свойданные заранее в виде строки, затем откройте ваш файл и запишите все сразу.Это связано с тем, что чем дольше выполняются операции ввода / вывода, тем больше вероятность возникновения ошибки в этом файле (ошибка блокировки файла, ошибка ввода-вывода и т. Д.).Простое выполнение всего за одну операцию не оставляет вопроса о том, когда это могло пойти не так.
Вот пример:
out_lines = []
for bamfile in bamfiles:
filename = bamfile.split('/')[-1]
out_lines.append('Filename: %s' % filename)
samtoolsin = subprocess.Popen(["/share/bin/samtools/samtools","view",bamfile],
stdout=subprocess.PIPE,bufsize=1)
linelist= samtoolsin.stdout.readlines()
print 'Readlines finished!'
out_lines.extend(linelist)
out_lines.append('\n')
И затем, когда вы все закончите, собирая свои строки данных"одна строка на элемент списка, вы можете объединить их с некоторыми '\n'
символами, чтобы сделать все это выводимым;может быть, даже обернуть ваш оператор вывода в блок with
, для дополнительной безопасности (автоматически закроет ваш дескриптор вывода, даже если что-то пойдет не так):
out_string = '\n'.join(out_lines)
out_filename = 'myfile.txt'
with open(out_filename, 'w') as outf:
outf.write(out_string)
print "YAY MY STDOUT IS UNTAINTED!!!"
Однако если у вас есть много данных для записи, вы может писать по одному кусочку за раз.Я не думаю, что это имеет отношение к вашей заявке, но вот альтернатива:
out_filename = 'myfile.txt'
outf = open(out_filename, 'w')
for bamfile in bamfiles:
filename = bamfile.split('/')[-1]
outf.write('Filename: %s' % filename)
samtoolsin = subprocess.Popen(["/share/bin/samtools/samtools","view",bamfile],
stdout=subprocess.PIPE,bufsize=1)
mydata = samtoolsin.stdout.read()
outf.write(mydata)
outf.close()