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

Windows 10下shutil.which无法识别wsl.exe的问题求助

解决shutil.which无法找到wsl.exe的问题

我之前也碰到过一模一样的情况,结合你的描述,大概率是32位Python与64位Windows的文件系统重定向在搞鬼,下面给你拆解原因和靠谱的解决办法:

核心原因分析

在64位Windows系统中,32位程序会被系统自动做路径重定向:当你尝试访问C:\Windows\System32时,实际会被偷偷转到C:\Windows\SysWOW64目录(专门放32位系统文件的地方)。而wsl.exe只存在于真正的System32目录里,32位Python调用shutil.which时,自然搜不到它。

你测试cmd.exe能正常找到,是因为cmd.exe在SysWOW64里也有一份32位版本,所以32位Python能搜到;而直接执行where wsl.exe返回退出码1,也是同样的重定向逻辑导致——32位环境下的where命令根本看不到真正的System32里的wsl.exe。

具体解决方案

方案1:换成64位Python(最省心)

这是最简单直接的办法:

  1. 打开Python终端,输入以下命令确认当前Python位数:
    import platform
    print(platform.architecture())
    
    如果输出是('32bit', 'WindowsPE'),说明你在用32位Python。
  2. 卸载32位Python,安装对应版本的64位Python,之后再调用shutil.which("wsl.exe")就能正常返回路径了。

方案2:在32位Python中禁用文件系统重定向

如果你暂时不想换Python,可以用ctypes调用Windows API绕过重定向,代码示例:

import ctypes
import shutil

# 调用Windows API禁用WOW64文件系统重定向
kernel32 = ctypes.WinDLL('kernel32', use_last_error=True)
wow64_disable = kernel32.Wow64DisableWow64FsRedirection
wow64_revert = kernel32.Wow64RevertWow64FsRedirection

old_value = ctypes.c_long()
success = wow64_disable(ctypes.byref(old_value))

try:
    # 现在可以正常找到wsl.exe了
    wsl_path = shutil.which("wsl.exe")
    print(wsl_path)
finally:
    # 记得恢复重定向,避免影响其他操作
    if success:
        wow64_revert(old_value)

方案3:直接检查默认路径

如果只是要验证WSL是否安装,也可以跳过shutil.which,直接检查wsl.exe的默认位置是否存在:

import os

wsl_default_path = os.path.join(os.environ.get('WINDIR', 'C:\\Windows'), 'System32', 'wsl.exe')
if os.path.exists(wsl_default_path):
    print("WSL已安装")
else:
    print("未找到WSL")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:37:06