我在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时生成的文件相同。这样就可以了;我只是无法捕获输出。为了使事情更加混乱,我可以使用与我发布的代码基本相同的代码成功捕获其他进程(回声,其他Python脚本)的输出。
有什么想法吗?我错过了令人眼花blind乱的明显东西吗?
最佳答案
您忘记了逗号:
["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
完全产生输出所必需的冗长的开关,因此它将丢失而保持沉默。每当您在调用子流程时遇到问题时,请三遍检查创建的命令行。在
args
之前加上['echo']
可以帮助您:proc = subprocess.Popen(['echo'] + args, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
output, err = proc.communicate()
print(output)