0

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

谢谢!

4

1 回答 1

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)

参考资料,相关问题

于 2018-03-11T00:37:01.673 回答