我在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)
答案 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拆分成一个列表,就像在另一个答案中一样 - 这是旧代码,但确实有效。