我正在编写一个程序来自动化一些qiime2命令。我希望合并用户输入。
到目前为止,我有:
# Items to import
import subprocess
from sys import argv
#Variables
format=argv[1]
# Import sequences for Phred33 format
if format=='Phred33':
cmnd = 'qiime tools import --type SampleData[PairedEndSequencesWithQuality] --input-path manifest.csv --output-path paired-end-demux.qza --source-format PairedEndFastqManifestPhred33'
print('executing {}'.format(cmnd))
res = subprocess.call(cmnd, shell=True)
print('command terminated with status', res)
# Import sequences for Phred64 format
if format=='Phred64':
cmnd = 'qiime tools import --type SampleData[PairedEndSequencesWithQuality] --input-path manifest.csv --output-path paired-end-demux.qza --source-format PairedEndFastqManifestPhred64'
print('executing {}'.format(cmnd))
res = subprocess.call(cmnd, shell=True)
print('command terminated with status', res)
这很好用,因为只有两个可能的用户输入,但是当有无数可能的用户输入时,我宁愿没有if语句。
这会更好:
cmnd = 'qiime tools import --type SampleData[PairedEndSequencesWithQuality] --input-path manifest.csv --output-path paired-end-demux.qza --source-format PairedEndFastqManifest', format
但是qiime2给了我这个错误。还有另一种方式吗?
谢谢!
答案 0 :(得分:0)
当您执行的命令是从未经过验证的用户输入构建时,请不要使用shell=True
。它可以使用户能够执行任意命令,即使这是不需要的。
此外,将该命令作为列表传递给subprocess.call
,以避免引用问题。
cmnd = [
'qiime', 'tools', 'import',
'--type', 'SampleData[PairedEndSequencesWithQuality]',
'--input-path', 'manifest.csv',
'--output-path', 'paired-end-demux.qza',
'--source-format', 'PairedEndFastq{}'.format(format)
]
print('executing {}'.format(' '.join(cmnd)))
res = subprocess.call(cmnd)