python 将 stderr 重定向到文件不起作用

python redirecting stderr to file does not work

我有一个 python 脚本,它运行具有不同输入的程序。我想将 stderr 输出重定向到文件并构建一个 html 文件。

我的问题是,我的脚本运行了,但是文件中没有写入 stderr,它就像消失在某处一样。我试过 os.system()subprocess.call

#!/usr/bin/python 
import os
import subprocess
indir = 'good'
name = 'good'
count = 0
badcount = 0
file_num = 0
with open('output.html', 'w') as ofh:
    test = open('output.html')
    ofh.write("""<!DOCTYPE html>
            <html>
                <head>
                    <meta charset="utf-8" />
                </head>
                <body>\n""")
    for i in range(0, 2):
        for root, dirs, filenames in os.walk(indir):
            for f in filenames:
                if f.endswith('.tig'):
                    prog = './../src/tc ' + indir + '/' + f
                    prog1 = './../src/tc'
                    prog2 = indir + '/' + f
                    ofh.write('%s <br>\n' % (f))
                    x = os.system('%s &>output.html' % (prog))
                    x = subprocess.call([prog1, prog2], stderr=test)
                    if x == 0:
                        count += 1
                    else:
                        ofh.write("<br>\n")
                        badcount += 1
                        file_num += 1
        ofh.write("<br>\n")
        ofh.write('%s /%s good tests found in %s folder<br>\n'
                % (count, file_num, name))
        ofh.write('%s /%s bad tests found in %s folder<br>\n'
                % (badcount, file_num, name))
        count = 0
        badcount = 0
        file_num = 0
        if i == 0:
            indir = 'syntax'
            name = 'syntax'
        elif i == 1:
            indir = 'bind'
            name = 'bind'
        elif i == 2:
            indir = 'type'
            name = 'type'
    ofh.write("""   </body>
    </html>""")

这里我用 os.system 和 subprocess.call 进行了 2 次尝试,有人知道会发生什么吗?或者我做错了什么?

您可能想使用 subprocess 中的 Popen 并将 stdout 和 stderr 重定向到 PIPE

p = Popen(cmd, stdout=PIPE, stderr=PIPE)
    stdout, stderr = p.communicate()

这是一个模拟代码,其中我的 运行 命令会产生捕获到 html 文件中的错误。

from subprocess import Popen, PIPE

with open('output.html', 'w') as ofh:
    ofh.write("""<body>\n""")

    cmd = 'python file.png' #this will produce error
    p = Popen(cmd, stdout=PIPE, stderr=PIPE)
    stdout, stderr = p.communicate()

    ofh.write("""{}""".format(stderr))
    ofh.write("""</body>""")

这会导致以下错误:

C:\python file.png
  File "file.png", line 1
SyntaxError: Non-ASCII character '\x89' in file file.png on line 1, but no encod
ing declared; see http://python.org/dev/peps/pep-0263/ for details

在 html 文件

中捕获