Skip to main content
 首页 » 编程设计

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

2025年05月04日11insus

我在 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。它获取一个输入文件,过滤它,并将结果保存到一个新文件中。它只向标准输出写入几行,就像这样

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 脚本)的输出。

有什么想法吗?我是否漏掉了一些非常明显的东西?

请您参考如下方法:

你忘了一个逗号:

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

在 "33" 和 "-v" 之间添加它。

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

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

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

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

每当您在调用子进程时遇到问题,三次检查创建的命令行。在 args 前添加 ['echo'] 有助于:

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