我正在编写一个程序来自动化一些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 给了我错误。还有别的办法吗?
谢谢!
当您正在执行的命令是根据未经净化的用户输入构建的时,不要使用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)
参考文献、相关问题
- 子进程.调用使用字符串与使用列表
- 子流程中"shell=True"的实际含义
- https://docs.python.org/2/library/subprocess.html#frequently-used-arguments