【发布时间】:2013-10-24 21:33:55
【问题描述】:
我正在使用 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的用途。 -
hmm,事情是
subprocess.check_output将所有输出作为一个字符串抛出,而我需要将 stdout 与 stderr 分开 -
hmm,找到了使用 Popen 而不是子进程的解决方法。这里解释stackoverflow.com/questions/10103551/…
-
selffix - Popen 是子进程的一部分,所以不是 subprocess.call() 或 subprocess.check_output()
-
见stackoverflow.com/questions/5903501/…。是的,这是标准库中的一个错误。
标签: python file console stringio