Python 2.2 已经很老了。如果可以的话,您应该升级,因为subprocess
它确实比os.system
和好得多os.popen
。
您想要的是一个类似文件的对象,它既可以写入stdout
字符串也可以捕获字符串(可能使用StringIO)
. 然后您可以将该对象指定为stdout
和stderr
在您的subprocess
调用中。
import sys, subprocess
from cStringIO import StringIO
class Outcap(object):
def __init__(self):
self.output = StringIO()
def write(self, data):
sys.stdout.write(data)
self.output.write(data)
def flush(self):
sys.stdout.flush(data)
def close(self):
pass
@property
def text(self):
return self.output.getvalue()
outcap = Outcap()
try:
subprocess.check_call("foo bar baz".split(), stdout=outcap, stderr=outcap)
subprocess.check_call("one two three".split(), stdout=outcap, stderr=outcap)
except CalledProcessError as e:
outcap.write("return code: %s\n", e.returncode)
open("log.txt", "w").write(outcap.text)
如果您无法升级 Python,但您使用的是 Linux,则另一种选择是在 Python 之外通过管道传输您正在运行的命令来处理它tee
。
your command goes here 2>&1 | tee log.txt
这会将您的命令的所有输出保存log.txt
到标准输出并将其发送到标准输出。你从那里选择用它做什么取决于你的 Python 脚本。例如,您可以登录到一个临时文件并仅在其中一个命令失败时将其移动到永久位置。