如何通过Python监听键盘按键关闭logging生成的已打开日志文件?
解决方案:按任意键关闭Python日志报告文件
针对你用logging生成文本报告后,需要按任意键关闭已打开文件的需求,以下分两种场景给出可行方案,避免依赖第三方包的权限问题:
场景1:无需第三方包(推荐)
利用Python内置模块实现跨平台的按键监听,同时管理打开报告的进程:
import logging import platform import subprocess # 第一步:配置logging生成执行报告 logging.basicConfig( filename='execution_report.log', level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s' ) # 模拟程序执行日志 logging.info("程序启动") logging.info("完成数据处理") logging.info("程序执行结束") def open_report_and_get_process(file_path): """打开报告文件并返回对应的进程对象""" if platform.system() == 'Windows': # 用记事本打开(可替换为你的默认文本编辑器,比如notepad++) return subprocess.Popen(['notepad.exe', file_path]) elif platform.system() == 'Darwin': # macOS下打开新实例 return subprocess.Popen(['open', '-n', file_path]) else: # Linux下用xdg-open return subprocess.Popen(['xdg-open', file_path]) def wait_for_any_key(): """等待任意按键输入(跨平台)""" print("按任意键关闭报告窗口...") if platform.system() == 'Windows': import msvcrt msvcrt.getch() else: # Linux/macOS下调整终端模式实现无回车按键监听 import termios import sys fd = sys.stdin.fileno() old_term_settings = termios.tcgetattr(fd) try: termios.setcbreak(fd) sys.stdin.read(1) finally: termios.tcsetattr(fd, termios.TCSADRAIN, old_term_settings) # 打开报告并获取进程 report_process = open_report_and_get_process('execution_report.log') # 等待按键 wait_for_any_key() # 关闭报告进程 report_process.terminate() report_process.wait()
关键说明:
- 避免了
keyboard包的权限问题(Windows下需管理员权限、Linux需root),用系统内置模块更可靠 - 针对不同平台处理文件打开和按键监听逻辑
- 如果你用的是其他文本编辑器(如Notepad++、VS Code),只需替换
open_report_and_get_process里的启动命令即可
场景2:使用keyboard包(需注意权限)
如果你坚持用keyboard包,需确保脚本以管理员/root身份运行,代码示例:
import logging import keyboard import subprocess import platform # 配置logging logging.basicConfig(filename='execution_report.log', level=logging.INFO) logging.info("执行日志生成") # 打开报告并记录进程 if platform.system() == 'Windows': proc = subprocess.Popen(['notepad.exe', 'execution_report.log']) else: proc = subprocess.Popen(['xdg-open' if platform.system() == 'Linux' else 'open', '-n', 'execution_report.log']) print("按任意键关闭报告...") # 监听任意按键 keyboard.read_key() # 终止进程 proc.terminate()
注意事项:
- Windows下必须右键以管理员身份运行脚本,否则
keyboard无法捕获按键 - Linux/macOS下需用
sudo执行脚本,否则会抛出权限错误
内容的提问来源于stack exchange,提问作者Jathursan Mehavarnan
相关产品推荐
相关产品推荐

