我正在使用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缺少文件接口的这些部分,是否有任何原因导致无法实现?
subprocess.check_output
的作用。 - Blendersubprocess.check_output
把所有输出作为一个字符串抛出,而我需要将 stdout 和 stderr 分开。 - alexykot