You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

额外小建议

  1. 循环里加个time.sleep(0.5)(记得导入time模块),避免程序持续占用过高CPU
  2. 用subprocess.run()替代os.system()更安全,比如获取mpv进程ID可以写:subprocess.run(["pgrep", "mpv"], capture_output=True, text=True).stdout.strip(),避免shell=True带来的安全风险

内容的提问来源于stack exchange,提问作者smooll

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 22:24:28