在python中使用subprocess.call的Multpile stdin(用于bowtie)

时间:2012-04-03 18:00:57

标签: python bioinformatics subprocess

我在python中使用subprocess.call运算符来处理脚本时遇到了一个尴尬的问题。 我必须多次运行管道程序( 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 :(得分:0)

我对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"))

答案 1 :(得分:0)

如果您的输入文件实际上是一个文件(在您的示例中看起来是这样的),而不是来自其他进程的管道数据,我认为您根本不应该在subprocess.call函数中使用STDIN!
据我所知,你无法通过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,在shell环境变量$BOWTIE_INDEXES给出的目录中,这是bowtie检测索引文件的方式。)

我意识到我可能正在使用subprocess.call并且应该将我的命令/ options / args拆分成一个列表,就像在另一个答案中一样 - 这是旧代码,但确实有效。