使用 subprocess.run 程序不起作用,但从 run([xxx]) 复制文本确实有效。任何建议



我写了一小段代码来在多个文件上运行一个程序(cutadapt(。 但是,它为尝试运行的每个文件都会给出以下错误:"cutadapt:错误:无法识别的参数"。在MacOS上运行,python 3.7.3,

如果我在同一程序中打印语句,将其复制为终端中的单个调用,那么它确实有效。有人看到我做错了什么吗?

import glob
import subprocess
fastq_folder = "/path/2019.01_spades_output_pathodetect/FASTQ_trimming"
listoffiles = glob.glob(fastq_folder + "/*.gz")
for fastq in listoffiles:
    input_file = fastq
    output_file = fastq.replace("_001.fastq.gz", "_001CUT20.fastq.gz")
    output_file = fastq.replace("2019.01_spades_output_pathodetect/FASTQ_trimming/", "2019.01_spades_output_pathodetect/FASTQ_trimming/CUT20/")
    print("cutadapt", "--cut 20", "-o", output_file, input_file)
    subprocess.run(["cutadapt", "--cut 20", "-o", output_file, input_file])

所以终端中的输出是:

cutadapt --cut 20 -o /path/2019.01_spades_output_pathodetect/FASTQ_trimming/CUT20/AWGS09281_S20_L001_R2_001.fastq.gz /path/2019.01_spades_output_pathodetect/FASTQ_trimming/AWGS09281_S20_L001_R2_001.fastq.gz
Run "cutadapt --help" to see command-line options.
See https://cutadapt.readthedocs.io/ for full documentation.
cutadapt: error: unrecognized arguments: /path/2019.01_spades_output_pathodetect/FASTQ_trimming/AWGS09281_S20_L001_R2_001.fastq.gz

然后,当我复制打印的语句时,它可以工作:

cutadapt --cut 20 -o /path/2019.01_spades_output_pathodetect/FASTQ_trimming/CUT20/AWGS09281_S20_L001_R2_001.fastq.gz /path/2019.01_spades_output_pathodetect/FASTQ_trimming/AWGS09281_S20_L001_R2_001.fastq.gz

This is cutadapt 2.3 with Python 3.7.3
Command line parameters: --cut 20 -o /path/2019.01_spades_output_pathodetect/FASTQ_trimming/CUT20/AWGS09281_S20_L001_R2_001.fastq.gz /path/2019.01_spades_output_pathodetect/FASTQ_trimming/AWGS09281_S20_L001_R2_001.fastq.gz
Processing reads on 1 core in single-end mode ...
[   8<-------] 00:00:06       490,635 reads  @     13.6 µs/read;   4.42 M reads/minute
Finished in 6.71 s (14 us/read; 4.39 M reads/minute).

你需要分离所有的参数; "--cut 20"传递一个包含开关及其值的参数(它告诉程序它收到了一个名为 cut 20 的开关(。只有在命令行中用引号传递"--cut 20"以防止空格将其分解为程序argv的单独部分(在您的示例中显然没有(时,您才会将其作为单个参数传递。

将其拆分为"--cut", "20",它应该可以工作。

你的代码--cut 20传递给cutadapt作为一个参数,它显然无法处理。 (从cutadapt的参数解析器的角度来看,它可能认为您正在尝试指定一个名为" cut 20"的选项,该选项不存在。 您需要将参数一分为二:

subprocess.run(["cutadapt", "--cut", "20", "-o", output_file, input_file])

最新更新