我正在使用subprocess
包从 python 脚本调用一些外部控制台命令,我需要将文件处理程序传递给它以分别获取stdout和stderr。代码大致如下所示:
import subprocess
stdout_file = file(os.path.join(local_path, 'stdout.txt'), 'w+')
stderr_file = file(os.path.join(local_path, 'stderr.txt'), 'w+')
subprocess.call(["somecommand", "someparam"], stdout=stdout_file, stderr=stderr_file)
这可以正常工作,并且正在创建具有相关输出的 txt 文件。然而,在内存中处理这些输出而不创建文件会更好。所以我使用 StringIO 包来处理它:
import subprocess
import StringIO
stdout_file = StringIO.StringIO()
stderr_file = StringIO.StringIO()
subprocess.call(["somecommand", "someparam"], stdout=stdout_file, stderr=stderr_file)
但这不起作用。失败:
File "./test.py", line 17, in <module>
subprocess.call(["somecommand", "someparam"], stdout=stdout_file, stderr=stderr_file)
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 1063, in _get_handles
c2pwrite = stdout.fileno()
AttributeError: StringIO instance has no attribute 'fileno'
我看到它缺少本机文件对象的某些部分并因此而失败。
所以这个问题比实际更具教育意义 - 为什么 StringIO 缺少文件接口的这些部分,是否有任何原因无法实现?