subprocess.call中的用户输入

时间:2018-03-11 00:20:36

标签: python subprocess user-input qiime

我正在编写一个程序来自动化一些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给了我这个错误。还有另一种方式吗?

谢谢!

1 个答案:

答案 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)

参考文献,相关问题