Python,将函数的输出重定向到文件

时间:2017-08-25 16:34:00

标签: python python-3.x

我正在尝试将函数的输出存储到Python中的文件中,我想要做的是这样的:

def test():
        print("This is a Test")
file=open('Log','a')
file.write(test())
file.close()

但是当我这样做时,我收到了这个错误:

  

TypeError:参数1必须是字符串或只读字符缓冲区,   不是没有

PD:我正在尝试为无法修改的功能执行此操作。

5 个答案:

答案 0 :(得分:6)

每当任何操作需要成对执行时,请使用上下文管理器。

在这种情况下,请使用contextlib.redirect_stdout

with open('Log','a') as f:
    with contextlib.redirect_stdout(f):
        test()

编辑:如果您想将其作为字符串,请使用io.StringIO

f = io.StringIO()
with contextlib.redirect_stdout(f):
    test()
s = f.getvalue()

答案 1 :(得分:1)

您需要通过为标准输出分配实现write方法的对象(如文件)来重定向标准输出。

import sys

def test():
    print("This is a Test")

stdout_backup = sys.stdout

with open('Log', 'a') as f:
    sys.stdout = f
    test()

sys.stdout = stdout_backup

答案 2 :(得分:1)

您可以根据@o11c 答案定义装饰器:

def redirect_output_to_file(fname, overwrite=False):
    def real_redirect_output_to_file(func):
        def wrapper(*args, **kwargs):
            import contextlib
            with open(fname, 'w' if overwrite else 'a') as f:
                with contextlib.redirect_stdout(f):
                    retval = func(*args, **kwargs)
            return retval
        return wrapper
    return real_redirect_output_to_file

然后在任何函数上使用它:

@redirect_output_to_file('test_output.log')
def test():
   print('Hi')

答案 3 :(得分:0)

解决方案1:

您应该使用日志记录来执行此操作,而不是使用print:

import logging

logger = logging.getLogger('myapp')
hdlr = logging.FileHandler('/tmp/myapp.log')
logger.addHandler(hdlr)
logger.setLevel(logging.INFO)

def test():
    logger.info("This is a Test")

test()

上面的代码工作正常,你可以使用它。 PS:检查文件/tmp/myapp.log

中的输出

解决方案2:

只需在命令行中运行代码,并将所有输出存储到文件'text.log'

python main.py >> text.log

解决方案3:

import contextlib
from contextlib import ExitStack


def test():
    print('hello world')


with ExitStack() as stack:
    f = stack.enter_context(open('Log', 'a'))
    stack.enter_context(contextlib.redirect_stdout(f))
    test()

print("I'm not logged")

答案 4 :(得分:0)

函数是否在同一个文件中? 因为这是你可以做这样的事情

解决方案 1:

int

给予

import sys

def test():
        print("This is a test") 

out = sys.stdout
with open("Log", "a") as output:
    sys.stdout = output
    test()
sys.stdout = out 

文件中的内容,

[Program finished]

问题是该函数只打印,但不返回任何内容。 Python 3.4 添加了 https://docs.python.org/3/library/contextlib.html#contextlib.redirect_stdout,它允许您将标准输出重定向到文件:

解决方案 2:

This is a test
This is a test
PS C:\Users\tan\Desktop> cat stdout.py
def test():
  print("This is a Test")

from contextlib import redirect_stdout

with open('stdout.txt', 'w') as f:
  with redirect_stdout(f):
    test()

print('stdout in console again')