3

ファイルまたは stdout に直接書き込むのではなく、stderr をメモリに収集しようとしています。これを行うのは、特定の方法でエラー ログ ファイルを生成できるようにするためです。メモリ内の「ファイル」であるStringIOというライブラリを見つけました。私はそれがうまくいくとは思わない。これが私のコードです:

        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 内のファイルに書き込む以外に、他に何ができますか?

4

2 に答える 2

2
stdout = subprocess.check_output(args)

check_outputその他のオプションについては、ドキュメントを参照してください。

をキャプチャしたくない場合は、次stdoutを使用しますPopen.communicate

from subprocess import Popen, PIPE

p = Popen(args, stdout=log_fps["trace"], stderr=PIPE)
_, stderr = p.communicate()
于 2013-06-27T20:20:30.113 に答える
0
import subprocess

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

_, stderr = p.communicate()
print stderr,
于 2013-06-28T18:33:45.680 に答える