子进程调用中的用户输入



我正在编写一个程序来自动化一些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

相关内容

  • 没有找到相关文章

最新更新