保存子命令的错误信息 [英] Save error message of subprocess command
问题描述
当使用子运行bash命令,我可能会当命令无效碰到的情况。在这种情况下,bash将会返回一个错误讯息话题。我们怎样才能抓住这个消息?我想这个消息保存到一个日志文件。
下面是一个例子,我尝试在一个不存在的目录中列出的文件。
When running bash command using subprocess, I might run into situation where the command is not valid. In this case, bash would return an error messsage. How can we catch this message? I would like to save this message to a log file. The following is an example, where I try to list files in a non-existed directory.
try:
subprocess.check_call(["ls", "/home/non"])
df = subprocess.Popen(["ls", "/home/non"], stdout=subprocess.PIPE)
output, err = df.communicate()
# process outputs
except Exception as error:
print error
sys.exit(1)
击会打印出LS:无法访问的/ home /非:没有这样的文件或目录。我怎样才能得到这个错误信息?通过抓线以外的错误显然是不同的,它说:命令[LS,/家庭/非']'返回非零退出状态2。
Bash would prints "ls: cannot access /home/non: No such file or directory". How can I get this error message? The error caught by the except line is clearly different, it says "Command '['ls', '/home/non']' returned non-zero exit status 2".
推荐答案
您可以STDERR重定向到一个文件对象:
You can redirect stderr to a file object:
from subprocess import PIPE, CalledProcessError, check_call, Popen
with open("log.txt", "w") as f:
try:
check_call(["ls", "/home/non"], stderr=f)
df = subprocess.Popen(["ls", "/home/non"], stdout=PIPE)
output, err = df.communicate()
except CalledProcessError as e:
print(e)
exit(1)
输出到log.txt的:
Output to log.txt:
ls: cannot access /home/non: No such file or directory
如果您想在邮件中,除了:
If you want the message in the except:
try:
check_call(["ls", "/home/non"])
df = subprocess.Popen(["ls", "/home/non"], stdout=PIPE)
output, err = df.communicate()
except CalledProcessError as e:
print(e.message)
对于Python 2.6 e.message
将不起作用。您可以使用类似的Python版本2.7的 check_output
将与Python 2.6工作:
For python 2.6 the e.message
won't work. You can use a similar version of python 2.7's check_output
that will work with python 2.6:
from subprocess import PIPE, CalledProcessError, Popen
def check_output(*args, **kwargs):
process = Popen(stdout=PIPE, *args, **kwargs)
out, err = process.communicate()
ret = process.poll()
if ret:
cmd = kwargs.get("args")
if cmd is None:
cmd = args[0]
error = CalledProcessError(ret, cmd)
error.out = out
error.message = err
raise error
return out
try:
out = check_output(["ls", "/home"], stderr=PIPE)
df = Popen(["ls", "/home/non"], stdout=PIPE)
output, err = df.communicate()
except CalledProcessError as e:
print(e.message)
else:
print(out)
这篇关于保存子命令的错误信息的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!