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 文件
中捕获
我有一个 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 文件
中捕获