Hướng dẫn python redirect function output to file - xuất hàm chuyển hướng python sang tệp

Tôi đang cố gắng lưu trữ đầu ra của một hàm vào một tệp trong Python, những gì tôi đang cố gắng làm là một cái gì đó như thế này:

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

Nhưng khi tôi làm điều này, tôi gặp lỗi này:

TypeError: Đối số 1 phải là bộ đệm ký tự chỉ đọc hoặc chỉ đọc

PD: Tôi đang cố gắng làm điều này cho một chức năng mà tôi không thể sửa đổi.

Hỏi ngày 25 tháng 8 năm 2017 lúc 16:34Aug 25, 2017 at 16:34

Hướng dẫn python redirect function output to file - xuất hàm chuyển hướng python sang tệp

4

Bất cứ khi nào bất kỳ hoạt động nào cần được thực hiện theo cặp, hãy sử dụng Trình quản lý ngữ cảnh.

Trong trường hợp này, hãy sử dụng

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

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

Chỉnh sửa: Nếu bạn muốn nó dưới dạng chuỗi, hãy sử dụng

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

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

Đã trả lời ngày 25 tháng 8 năm 2017 lúc 16:46Aug 25, 2017 at 16:46

o11co11co11c

14.7K4 Huy hiệu vàng49 Huy hiệu bạc74 Huy hiệu đồng4 gold badges49 silver badges74 bronze badges

6

Bạn cần chuyển hướng đầu ra tiêu chuẩn bằng cách gán cho nó một đối tượng thực hiện phương thức

with open('Log','a') as f:
    with contextlib.redirect_stdout(f):
        test()
6, giống như một tệp.

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

Đã trả lời ngày 25 tháng 8 năm 2017 lúc 16:43Aug 25, 2017 at 16:43

Giải pháp 1:

Thay vì sử dụng in, bạn nên sử dụng đăng nhập để làm điều này:

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

Các mã trên hoạt động tốt, bạn có thể sử dụng nó. PS: Kiểm tra đầu ra trong Tệp /tmp/myapp.log

Giải pháp 2:

Chỉ cần chạy mã của bạn trong dòng lệnh và lưu trữ tất cả đầu ra vào tệp 'text.log'

python main.py >> text.log

Giải pháp 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")

Đã trả lời ngày 25 tháng 8 năm 2017 lúc 16:38Aug 25, 2017 at 16:38

Hướng dẫn python redirect function output to file - xuất hàm chuyển hướng python sang tệp

LIMENGLONG LIMenglong Li

2.07714 Huy hiệu bạc19 Huy hiệu đồng14 silver badges19 bronze badges

3

Bạn có thể xác định một trình trang trí dựa trên câu trả lời @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

Và sau đó sử dụng nó trên bất kỳ chức năng nào:

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

Đã trả lời ngày 12 tháng 2 năm 2021 lúc 20:33Feb 12, 2021 at 20:33

Hướng dẫn python redirect function output to file - xuất hàm chuyển hướng python sang tệp

Noam pelednoam peledNoam Peled

4.3264 Huy hiệu vàng42 Huy hiệu bạc48 Huy hiệu đồng4 gold badges42 silver badges48 bronze badges

Là chức năng trong cùng một tệp? vì đó là bạn có thể làm điều gì đó như thế này

Giải pháp 1:

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 

Thay vì sử dụng in, bạn nên sử dụng đăng nhập để làm điều này:

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

Các mã trên hoạt động tốt, bạn có thể sử dụng nó. PS: Kiểm tra đầu ra trong Tệp /tmp/myapp.log

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

Giải pháp 2:

Giải pháp 2:

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

Chỉ cần chạy mã của bạn trong dòng lệnh và lưu trữ tất cả đầu ra vào tệp 'text.log'Jun 6, 2021 at 11:51

Giải pháp 3:Subham

Đã trả lời ngày 25 tháng 8 năm 2017 lúc 16:381 gold badge6 silver badges14 bronze badges