使用 subprocess.call 在内存中收集 stderr [英] Collecting stderr in memory with subprocess.call

查看:20
本文介绍了使用 subprocess.call 在内存中收集 stderr的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试在内存中收集 stderr,而不是直接将其写入文件或 stdout.我这样做是为了以某种方式生成错误日志文件.我找到了一个名为 StringIO 的库,它是一个内存中的文件".我不认为它可以解决问题.这是我的代码:

I'm trying to collect stderr in memory, instead of directly writing it to a file or stdout. I do this so I can generated the error log file in a certain way. I found a library called StringIO that is an in-memory 'file'. I don't think it does the trick. Here's my code:

        buffer = StringIO.StringIO()
        status = subprocess.call(args, stdout=log_fps["trace"], stderr=buffer)

        if status and self.V_LEVEL:
            sys.stderr.write(buffer.getvalue())
            print "generated error"

        if status:
            log_fps["fail"].write("==> Error with files %s and %s\n" % (domain_file, problem_file))
            log_fps["fail"].write(buffer.getvalue())

我收到以下错误:

Traceback (most recent call last):
  File "./runit.py", line 284, in <module>
    launcher.run_all_cff_domain_examples("ring")
  File "./runit.py", line 259, in run_all_cff_domain_examples
    result = self.run_clg(in_d["domain"], in_d["problem"], in_d["prefix"])
  File "./runit.py", line 123, in run_clg
    status = subprocess.call(args, stdout=log_fps["trace"], stderr=buffer)
  File "/usr/lib/python2.7/subprocess.py", line 493, in call
    return Popen(*popenargs, **kwargs).wait()
  File "/usr/lib/python2.7/subprocess.py", line 672, in __init__
    errread, errwrite) = self._get_handles(stdin, stdout, stderr)
  File "/usr/lib/python2.7/subprocess.py", line 1075, in _get_handles
    errwrite = stderr.fileno()
AttributeError: StringIO instance has no attribute 'fileno'

我想这意味着我不能使用 StringIO 在内存中收集 stderr.除了写入/tmp 中的文件,我还能做什么?

I guess this means that I can't use StringIO to collect stderr in memory. What else can I do, short of writing to a file in /tmp?

推荐答案

stdout = subprocess.check_output(args)

请参阅check_output 文档更多选择.

See check_output documentation for more options.

如果不想捕获stdout,使用Popen.communicate:

from subprocess import Popen, PIPE

p = Popen(args, stdout=log_fps["trace"], stderr=PIPE)
_, stderr = p.communicate()

这篇关于使用 subprocess.call 在内存中收集 stderr的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆