【问题标题】:Problems capturing Python subprocess output on Mac OS X在 Mac OS X 上捕获 Python 子进程输出的问题
【发布时间】:2012-12-26 06:24:52
【问题描述】:

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

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

【问题讨论】:

  • 什么是args?是字符串还是list
  • 要检验@MartijnPieters 的假设,您可以将命令替换为更简单的命令……比如……echo foo。如果你从中得到了什么,那么fastq_quality_trimmer 正在做一些时髦的事情。
  • @mgilson:argslist。如果我替换 echo foo 或类似的东西,它会起作用。
  • 这里是 args: ["fastq_quality_trimmer", "-Q", "33" "-v", "-t", "50", "-l", "20", "-i", leftInitial, "-o", leftTrimmed] leftInitialleftTrimmed 是文件名。

标签: python macos subprocess popen


【解决方案1】:

你忘了一个逗号:

["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)

【讨论】:

  • 详细说明,“-v”被省略了,所以 fastq_quality_trimmer 不会在详细模式下运行。
  • @user1970411:是的,从我对实用程序源的检查中已经明白了。 :-)
猜你喜欢
  • 1970-01-01
  • 2011-08-25
  • 2016-07-21
  • 2012-08-15
  • 2016-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多