Python 在运行时自动刷新标准输出和标准错误到本地文本文件
Python auto-flush stdout and stderr to local text file at runtime
我有一个 Python 脚本来持续监控各种传感器。我的 Python 脚本定期使用 print() 语句。
我的目标是让我的 Python 脚本实时发送 stdout
和 stderr
到一个文件。
我当前的解决方案基于以下两个答案:
- How to redirect the output of print to a TXT file
- Redirect stdout to a file in Python?
这是我当前的代码:
from contextlib import redirect_stdout, redirect_stderr
from os.path import join
from some_other_package import get_base_logging_path # returns filepath (str)
def main():
stdout_log_path = join(get_base_logging_path(), "stdout.txt")
stderr_log_path = join(get_base_logging_path(), "stderr.txt")
with open(stdout_log_path, 'w') as f1, redirect_stdout(f1), \
open(stderr_log_path, 'w') as f2, redirect_stderr(f2):
do_stuff()
这是我来到 Stack Overflow 的地方:文件 stdout.txt
和 stderr.txt
仅在脚本出错或我用 control-C
安全关闭它时才修改。
我希望(特别是 stdout.txt
)在我的 Python 代码中每次执行新的 print()
语句时得到更新。我怎样才能让我的程序自动刷新 stdout
和 stderr
到文本文件?
注意:我试过python -u
,但似乎不起作用。
将文件的缓冲区大小设置为 1 对我有用
from contextlib import redirect_stdout
import time
import sys
with open("foo.txt", "w", buffering=1) as handle:
with redirect_stdout(handle):
print("foo")
time.sleep(30)
print("bar")
同样有效的方法是使用带 flush 关键字的 print
print("foobar", flush=True)
但如果您不能修改打印语句,则可能无法使用后者
我有一个 Python 脚本来持续监控各种传感器。我的 Python 脚本定期使用 print() 语句。
我的目标是让我的 Python 脚本实时发送 stdout
和 stderr
到一个文件。
我当前的解决方案基于以下两个答案:
- How to redirect the output of print to a TXT file
- Redirect stdout to a file in Python?
这是我当前的代码:
from contextlib import redirect_stdout, redirect_stderr
from os.path import join
from some_other_package import get_base_logging_path # returns filepath (str)
def main():
stdout_log_path = join(get_base_logging_path(), "stdout.txt")
stderr_log_path = join(get_base_logging_path(), "stderr.txt")
with open(stdout_log_path, 'w') as f1, redirect_stdout(f1), \
open(stderr_log_path, 'w') as f2, redirect_stderr(f2):
do_stuff()
这是我来到 Stack Overflow 的地方:文件 stdout.txt
和 stderr.txt
仅在脚本出错或我用 control-C
安全关闭它时才修改。
我希望(特别是 stdout.txt
)在我的 Python 代码中每次执行新的 print()
语句时得到更新。我怎样才能让我的程序自动刷新 stdout
和 stderr
到文本文件?
注意:我试过python -u
,但似乎不起作用。
将文件的缓冲区大小设置为 1 对我有用
from contextlib import redirect_stdout
import time
import sys
with open("foo.txt", "w", buffering=1) as handle:
with redirect_stdout(handle):
print("foo")
time.sleep(30)
print("bar")
同样有效的方法是使用带 flush 关键字的 print
print("foobar", flush=True)
但如果您不能修改打印语句,则可能无法使用后者