在Mac OS X上捕获Python子进程输出的问题

时间:2013-01-11 16:11:14

标签: python macos subprocess popen

我在Mac OS 10.6.8上运行Python 3.3。我正在编写一个运行多个子进程的脚本,我想捕获每个子进程的输出并将其记录在一个文件中。我遇到了这个问题。

我首先尝试了以下内容:

import subprocess
logFile = open("log.txt", 'w')
proc = subprocess.Popen(args, stdout=logFile, stderr=logFile)
proc.wait()

这产生了一个空的log.txt。在网上闲逛了一下后,我试了一下

import subprocess
proc = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
output, err = proc.communicate()
logFile = open("log.txt", 'w')
logFile.write(output)

这也产生了一个空的log.txt。因此,我没有写入文件,而是尝试将输出打印到命令行:

output, err = proc.communicate()
print(output)
print(err)

这产生了这个:

b''
b''

我正在尝试运行的过程是fastq_quality_trimmer。它接受一个输入文件,对其进行过滤,并将结果保存到新文件中。它只向stdout写了几行,就像这样

Minimum Quality Threshold: 20
Minimum Length: 20
Input: 750000 reads.
Output: 750000 reads.
discarded 0 (0%) too-short reads.

如果我从命令行运行它并像这样重定向输出

fastq_quality_trimmer -Q 33 -v -t 50 -l 20 -i in.fq -o in_trimmed.fq > log.txt

输出成功写入log.txt。

我想也许当我用Popen调用它时,fastq_quality_trimmer以某种方式无法运行,但是我的脚本产生的过滤文件与我从命令行运行fastq_quality_trimmer时生成的文件相同。所以它是工作;我只是无法捕获输出。为了让事情更加混乱,我可以使用与我发布的代码基本相同的代码成功捕获其他进程(echo,其他Python脚本)的输出。

有什么想法?我错过了一些非常明显的东西吗?

1 个答案:

答案 0 :(得分:1)

你忘记了一个逗号:

["fastq_quality_trimmer", "-Q", "33" "-v", "-t", "50", "-l", "20", "-i", leftInitial, "-o", leftTrimmed]

"33""-v"之间添加。

您实际上是在传递参数-Q 33-v而不是-Q 33 -v

如果两个相邻的字符串之间只有空格,那么它将连接两个相邻的字符串:

>>> "33", "-v"
('33', '-v')
>>> "33" "-v"
'33-v'

由于-v是使fastq_quality_trimmer产生输出所需的详细开关,因此它会保持沉默,因为它丢失了。

每当遇到调用子进程的问题时, triple 检查创建的命令行。有args的待处理['echo']可以提供帮助:

proc = subprocess.Popen(['echo'] + args, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
output, err = proc.communicate()
print(output)