Python调用cmd命令quser报错未识别,如何获取其输出?
解决Python调用quser命令提示不存在的问题
我来帮你搞定这个问题——你遇到的'quser' 不是内部或外部命令错误,大概率是32位Python和64位Windows的文件系统重定向导致的,再加上路径调用的小细节问题,咱们一步步来修复:
问题根源
quser是Windows自带的系统工具,实际路径是C:\Windows\System32\quser.exe,但如果你的Python是32位版本,它会自动把System32目录重定向到SysWOW64(专门存放32位系统文件的目录),而SysWOW64里并没有quser.exe,所以直接调用就会报错。
解决方案
1. 用Sysnative路径绕过重定向
Windows提供了C:\Windows\Sysnative这个虚拟路径,它能让32位程序直接访问64位的System32目录。修改你的代码,直接指定这个路径:
import subprocess # 调用64位的quser.exe p = subprocess.Popen( r"C:\Windows\Sysnative\quser.exe", shell=False, # 不需要shell=True,直接调用可执行文件更可靠 stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True # 让输出直接是字符串,不用手动解码字节 ) out, err = p.communicate() if err: print(f"执行出错: {err.strip()}") else: print(out)
2. 换成64位Python(更彻底的方案)
如果你的系统是64位的,直接安装64位的Python 3.7.3,这样就能直接调用quser或者C:\Windows\System32\quser.exe,不会有路径重定向的麻烦。
3. 提取用户信息并执行注销
拿到quser的输出后,你可以解析出会话ID,然后用logoff命令注销指定用户。比如要注销用户Doe:
# 解析quser输出 if out: # 跳过表头行,处理用户数据 user_lines = out.strip().split('\n')[1:] for line in user_lines: # 分割行内容(处理连续空格的情况) parts = [item for item in line.split() if item] username = parts[0] session_id = parts[2] if username == "Doe": # 执行注销命令,需要管理员权限 try: subprocess.run( ["logoff", session_id], check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True ) print(f"成功注销用户 {username}") except subprocess.CalledProcessError as e: print(f"注销失败: {e.stderr.strip()}")
注意事项
- 权限问题:注销其他用户需要管理员权限,运行Python脚本时要右键选择「以管理员身份运行」。
- shell=True的坑:尽量不要用
shell=True,直接调用可执行文件更安全,也能避免一些环境变量的异常。
内容的提问来源于stack exchange,提问作者Ohav
相关产品推荐
相关产品推荐

