使用子流程运行程序不起作用,但从run([xxx])复制文本起作用。有什么建议吗

2024-06-16 12:54:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经写了一些代码来在多个文件上运行一个程序(cutadapt)。但是,对于它尝试运行的每个文件,它都会给出以下错误:“cutadapt:error:unrecognized arguments”。 在MacOS、Python3.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).

Tags: pathoutputfastqfilecutadaptr2gzcut
2条回答

您需要将所有参数分开;" 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])

相关问题 更多 >