2013-07-09 61 views
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() 

任何人都可以请告知如何才能实现?或者有可能完全相同?

回答

1

使用subprocess.check_output

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

在Python 2.6,既可以使用反向移植subprocess32,或者复制2.7 source for check_output

+0

'打印subprocess.check_output([ './的MyScript']) AttributeError的: '模块' 对象没有属性“check_output'' – misguided

+0

@misguided:您是* * 2.7上,作为标签指示,对? – user2357112

+0

Python 2.6.4,对于混淆抱歉。将删除标签。 – misguided

-1
subprocess.check_ouput 

在Python 2.7引入的,如果你onlu可以使用以前的版本,你可以只使用POPEN和标准输出设置为您的输出流(但你的情况,你已经overrided的sys.stdout的,我认为这是没有必要的),只是更改为:

p = subprocess.Popen(['./MyScript']) 
+0

不提供所需的输出。在运行'MyScript'后,运行该脚本的unix(SSH)窗口挂起。 – misguided

+0

这不是一个完整的解决方案;只是创建一个'Popen'并没有什么好处,除非你将一个'stdout'管道传递给它,读取它,并且'轮询'或'等待'这个过程(或者将后两者合并为'communic'')。 – abarnert

+0

@abarnert你的意思'会话= subprocess.Popen([ './的MyScript'],标准输入= PIPE,由于输出= PIPE,标准错误= PIPE)'。不知道在这里做什么 – misguided

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 
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()