Python中if条件为真时对应代码块未执行问题求助
问题描述
我正在用Python编写一个检测活动窗口ID的简单程序,在while True循环内有一个if语句,用于判断活动窗口ID是否与预期ID匹配。
代码如下:
import os, subprocess def get_window_id(): output = subprocess.check_output("xprop -root | grep \"window id\"", shell=True) get_window_id.result = {} for row in output.split(b"\n"): if b": " in row: key, value = row.split(b": ") get_window_id.result[key.strip(b"window id # ")] = value.strip() while True: get_window_id() print(get_window_id.result[b"_NET_ACTIVE_WINDOW(WINDOW)"].strip(b"window id # ")) if get_window_id.result[b"_NET_ACTIVE_WINDOW(WINDOW)"].strip(b"window id # ") != "b'0x3000003'": os.system("kill -STOP $(pgrep mpv)") else: os.system("kill -CONT $(pgrep mpv)")
当前问题:当活动窗口ID与预期不匹配时,对应条件的代码块可正常执行;但当ID匹配时,else对应的代码块无法执行。
问题分析与解决
核心问题是类型不匹配:
你获取到的窗口ID是bytes类型(比如实际值是b'0x3000003'),但判断时却和字符串"b'0x3000003'"做比较——这两个值永远不可能相等,所以else分支永远不会触发。
下面是两种可行的修改方案:
方案1:直接用bytes类型做比较
import os, subprocess def get_window_id(): output = subprocess.check_output("xprop -root | grep \"window id\"", shell=True) result = {} for row in output.split(b"\n"): if b": " in row: key, value = row.split(b": ") result[key.strip(b"window id # ")] = value.strip() return result # 预期ID用bytes类型 TARGET_ID = b'0x3000003' while True: window_data = get_window_id() active_id = window_data[b"_NET_ACTIVE_WINDOW(WINDOW)"].strip(b"window id # ") print(active_id) if active_id != TARGET_ID: os.system("kill -STOP $(pgrep mpv)") else: os.system("kill -CONT $(pgrep mpv)")
方案2:把bytes解码成字符串再比较
import os, subprocess def get_window_id(): output = subprocess.check_output("xprop -root | grep \"window id\"", shell=True) result = {} for row in output.split(b"\n"): if b": " in row: key, value = row.split(b": ") result[key.strip(b"window id # ")] = value.strip() return result # 预期ID用字符串类型 TARGET_ID = '0x3000003' while True: window_data = get_window_id() # 将bytes解码为utf-8字符串 active_id = window_data[b"_NET_ACTIVE_WINDOW(WINDOW)"].strip(b"window id # ").decode('utf-8') print(active_id) if active_id != TARGET_ID: os.system("kill -STOP $(pgrep mpv)") else: os.system("kill -CONT $(pgrep mpv)")
额外小建议
- 循环里加个
time.sleep(0.5)(记得导入time模块),避免程序持续占用过高CPU - 用
subprocess.run()替代os.system()更安全,比如获取mpv进程ID可以写:subprocess.run(["pgrep", "mpv"], capture_output=True, text=True).stdout.strip(),避免shell=True带来的安全风险
内容的提问来源于stack exchange,提问作者smooll
相关产品推荐
相关产品推荐

