Python写入系统监控信息到TXT文件时内容为None问题求助
问题产生原因
run_all_checks()函数没有显式定义返回值,Python中所有无return语句的函数默认返回None,执行str(run_all_checks())得到的就是字符串"None",写入文件后自然仅显示该内容。- 写入逻辑被放在
if not os.path.exists(...)判断块内,只有首次运行、文件夹尚未创建时才会执行写入,后续文件夹存在时不会更新文件内容。 - Windows路径中的反斜杠
\是Python的转义字符,直接编写路径可能出现转义解析错误,存在隐患。 - 现有监控函数均为直接打印内容到控制台,没有收集输出结果的逻辑,即使给
run_all_checks()加返回语句也无法拿到监控内容。
正确实现方案
方案1:修改函数返回内容(推荐,可维护性更高)
首先调整所有监控函数,将原有print输出改为返回字符串格式的监控结果:
# 示例:原有监控函数修改前后对比 # 修改前 def monitor_cpu_util(): print(f"CPU使用率: {psutil.cpu_percent()}%") # 修改后 def monitor_cpu_util(): return f"CPU使用率: {psutil.cpu_percent()}%\n"
之后修改run_all_checks()函数,收集所有监控结果拼接后返回:
def run_all_checks(): info_list = [ montior_cpu_times(), monitor_cpu_util(), monitor_cpu_cores(), monitor_cpu_freq(), monitor_RAM_Usage(), monitor_disk(), monitor_disk_usage(), monitor_network() ] return "".join(info_list)
最后调整主逻辑,修正路径问题、将写入逻辑移出文件夹判断块:
import os import psutil # 确保存储文件夹一定存在 save_path = r'C:\System Information Dump' if not os.path.exists(save_path): os.makedirs(save_path) # 拼接完整文件路径 file_name = "System Info Dump.txt" complete_name = os.path.join(save_path, file_name) # 用with上下文管理写入文件,无需手动调用close with open(complete_name, "a", encoding="utf-8") as f: f.write(run_all_checks()) # 可选:添加时间分隔线,区分不同运行时间的记录 f.write("\n" + "="*50 + f"\n记录时间: {__import__('datetime').datetime.now()}\n" + "="*50 + "\n\n")
方案2:重定向标准输出(无需修改原有监控函数)
如果不想改动原有监控函数的打印逻辑,可以临时重定向系统标准输出,将所有控制台打印内容直接写入文件:
import os import sys import psutil def run_all_checks(): # 你的原有函数内容无需修改 montior_cpu_times() monitor_cpu_util() monitor_cpu_cores() monitor_cpu_freq() monitor_RAM_Usage() monitor_disk() monitor_disk_usage() monitor_network() # 主逻辑 save_path = r'C:\System Information Dump' if not os.path.exists(save_path): os.makedirs(save_path) complete_name = os.path.join(save_path, "System Info Dump.txt") # 临时重定向标准输出到文件 with open(complete_name, "a", encoding="utf-8") as f: original_stdout = sys.stdout sys.stdout = f run_all_checks() # 恢复默认标准输出,避免影响后续代码运行 sys.stdout = original_stdout
内容的提问来源于stack exchange,提问作者billy
相关产品推荐
相关产品推荐

