Я вызываю программу из оболочки, используя модуль подпроцесса, который выводит двоичный файл в STDOUT.
Я использую Popen () для вызова программы, а затем хочу передать поток функции в пакете Python (называемом «pysam»), которая, к сожалению, не может файловые объекты Python, но может читать из STDIN. Поэтому я хотел бы, чтобы выходные данные команды оболочки были переведены из STDOUT в STDIN.
Как это можно сделать из модуля Popen / подпроцесса? Вот как я называю программу оболочки:
p = subprocess.Popen(my_cmd, stdout=subprocess.PIPE, shell=True).stdout
Это прочитает вывод STDOUT my_cmd и получит к нему поток в p. Поскольку мой модуль Python не может читать из «p» напрямую, я пытаюсь перенаправить STDOUT «my_cmd» обратно в STDIN, используя:
p = subprocess.Popen(my_cmd, stdout=subprocess.PIPE, stdin=subprocess.PIPE, shell=True).stdout
Затем я вызываю мой модуль, который использует "-" в качестве заполнителя для STDIN:
s = pysam.Samfile("-", "rb")
Вышеуказанный вызов просто означает чтение из STDIN (обозначается "-") и чтение его как двоичного файла ("rb").
Когда я пытаюсь это сделать, я просто посылаю двоичный вывод на экран, и не похоже, что функция Samfile () может его прочитать. Это происходит, даже если я удаляю вызов Samfile, поэтому я думаю, что проблема заключается именно в моем вызове Popen, а не в последующих шагах.
РЕДАКТИРОВАТЬ: В ответ на ответы я попытался:
sys.stdin = subprocess.Popen(tagBam_cmd, stdout=subprocess.PIPE, shell=True).stdout
print "Opening SAM.."
s = pysam.Samfile("-","rb")
print "Done?"
sys.stdin = sys.__stdin__
Кажется, это зависает. Я получаю вывод:
Opening SAM..
но он никогда не проходит через линию Samfile ("-", "rb"). Есть идеи почему?
Есть идеи, как это можно исправить?
РЕДАКТИРОВАТЬ 2: Я добавляю ссылку на документацию Pysam на случай, если это поможет, я действительно не могу понять это. Страница документации:
http://wwwfgu.anat.ox.ac.uk/~andreas/documentation/samtools/usage.html
и конкретное примечание о потоках здесь:
http://wwwfgu.anat.ox.ac.uk/~andreas/documentation/samtools/usage.html#using-streams
В частности:
""»
Pysam не поддерживает чтение и запись из настоящих файловых объектов Python, но поддерживает чтение и запись из stdin и stdout. Следующий пример читает из stdin и пишет в stdout:
infile = pysam.Samfile( "-", "r" )
outfile = pysam.Samfile( "-", "w", template = infile )
for s in infile: outfile.write(s)
Он также будет работать с файлами BAM. Следующий скрипт преобразует файл в формате BAM на stdin в файл в формате SAM на stdout:
infile = pysam.Samfile( "-", "rb" )
outfile = pysam.Samfile( "-", "w", template = infile )
for s in infile: outfile.write(s)
Обратите внимание, что только режим открытия файла необходимо изменить с r на rb.
"" "
Так что я просто хочу взять поток, исходящий из Popen, который читает stdout, и перенаправить его в stdin, чтобы я мог использовать Samfile ("-", "rb"), так как описанные выше состояния раздела возможны.
спасибо.