0

我的要求是在控制台中打印文件的输出以及日志文件。以下代码为我做了这件事,除了一个小问题。我在文件末尾调用 perl 脚本,其输出显示在控制台中,但没有打印到文件中。

import subprocess
import sys
class Tee(object):
    def __init__(self, *files):
        self.files = files
    def write(self, obj):
        for f in self.files:
            f.write(obj)

f = open('MyFile.txt', 'w')
original = sys.stdout
sys.stdout = Tee(sys.stdout, f)
print "Logging Started"
# My code
print "A"

subprocess.call(['./MyScript])
sys.stdout = original
print "Logging Stopped"  # Only on stdout
f.close()

谁能告诉我如何实现?或者有没有可能达到同样的效果?

4

4 回答 4

1

使用subprocess.check_output

print subprocess.check_output(['./MyScript])

在 Python 2.6 中,要么使用 backport subprocess32,要么复制2.7 的源代码check_output

于 2013-07-09T01:32:20.693 回答
0

如果你看check_output是在Python2.7中实现的,你应该可以弄清楚如何使用subprocess.Popen

def check_output(*popenargs, **kwargs):
    if 'stdout' in kwargs:
        raise ValueError('stdout argument not allowed, it will be overridden.')
    process = Popen(stdout=PIPE, *popenargs, **kwargs)
    output, unused_err = process.communicate()
    retcode = process.poll()
    if retcode:
        cmd = kwargs.get("args")
        if cmd is None:
            cmd = popenargs[0]
        raise CalledProcessError(retcode, cmd, output=output)
    return output
于 2013-07-09T01:44:35.020 回答
0

下面的代码对我有用。感谢大家的帮助。

#!/usr/bin/python
import os
import subprocess
import sys
class Tee(object):
    def __init__(self, *files):
        self.files = files
    def write(self, obj):
        for f in self.files:
            f.write(obj)

f = open('MyFile.txt', 'w')
original = sys.stdout
sys.stdout = Tee(sys.stdout, f)
print "Logging Started"
# My code
print "A"

def check_output(*popenargs, **kwargs):
    process = subprocess.Popen(stdout=subprocess.PIPE, *popenargs, **kwargs)
    output, unused_err = process.communicate()
    retcode = process.poll()
    if retcode:
        cmd = kwargs.get("args")
        if cmd is None:
            cmd = popenargs[0]
        error = subprocess.CalledProcessError(retcode, cmd)
        error.output = output
        raise error
    return output

location = "%s/folder"%(os.environ["Home"])
myoutput = check_output(['./MyFile'])
print myoutput
sys.stdout = original
print "Logging Stopped"  # Only on stdout
f.close()
于 2013-07-09T05:35:27.527 回答
-1
subprocess.check_ouput

在python 2.7中引入,如果你可以使用以前的版本,你可以使用Popen并将stdout设置为你的输出流(但在你的情况下,你已经覆盖了sys.stdout,我认为它不需要),只是改成:

p = subprocess.Popen(['./MyScript'])
于 2013-07-09T01:43:40.427 回答