Multpile Stdin с использованием subprocess.call в Python (для бабочки) - PullRequest
1 голос
/ 03 апреля 2012

Я сталкиваюсь с неловкой проблемой использования оператора subprocess.call в python для скрипта. Мне приходится запускать конвейерную программу ( bowtie ) несколько раз, а затем использовать вывод различными способами. Для этого я использую subprocess.call.

Проблема в том, что bowtie принимает входные 2 файла, индекс и текстовый файл, и я не могу назначить их оба для параметра stdin.

Я также пытался включить путь к индексу в args, но, конечно, bowtie не распознает его как индекс и выдает ошибку. Поскольку этот индекс всегда один и тот же, есть ли способ избежать этой проблемы?

Вот часть кода, над которым я работаю (очень сырой):

inpath  = "/media/2tbhd/workdata/nanocage_noadapt/zf/fasta/zf_ad_c_r2.fasta"
ind_path = "indexes/zf_gen_topl"
for elem in plist:
        cmd = subprocess.call(["bowtie","-f","-v 3", "--best" "--suppress 6,7" "-p 6"], shell = True, stdin = inpath, ind_path)

Ответы [ 2 ]

0 голосов
/ 04 апреля 2012

Если ваш входной файл на самом деле является файлом (именно так он и выглядит в вашем примере), а не передал данные из какого-либо другого процесса, я не думаю, что вам вообще следует использовать STDIN в функции subprocess.call!
И, насколько я знаю, вы не можете предоставить индекс через STDIN обычному боути из командной строки - это должен быть файл.Так что это определенно должен быть нормальный аргумент, а не из STDIN.

Так я обычно называю bowtie из скрипта (и входной файл, и индекс как файлы, без STDIN):

subprocess.call(["bowtie %s %s %s %s"(full_options,indexname,infile,outfile)], 
                shell=True)

Где full_options - это что-то вроде '-f -m1 -v1 --best --tryhard -S --sam-nosq', а indexname - что-то вроде 'Chlre4nm_cassette_new_m' (которое является базовым именем набора именованных имен файлов вида Chlre4nm_cassette_new_m. *. Ebwt, в каталогезадается переменной среды оболочки $BOWTIE_INDEXES, то есть, как bowtie обнаруживает свои индексные файлы).

Я понимаю, что, вероятно, я плохо использую subprocess.call и должен разбить мои команды / options / args на список, подобныйв другом ответе - это старый код, но он работает.

0 голосов
/ 03 апреля 2012

Я ничего не знаю о bowtie, но мне кажется, что ваш звонок должен выглядеть примерно так:

cmd = subprocess.call(['bowtie','-f',inpath,'-v','3', '--best','--suppress','6,7','-p','6',ind_path])

Как правило, вы передаете список аргументов подпроцессу в точности так, как если бы они были в командной строке. Если вы знаете, как будет выглядеть командная строка, вы можете использовать замечательный модуль shlex для разделения команды. e.g.:

import shlex
import subprocess
cmd=subprocess.call(shlex.split("ls -al"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...