Python shutil.which不使用wsl.exe

问题描述 投票:2回答:1

我正在尝试使用shutil.which来检查Linux子系统是否安装在Windows 10上。

在命令提示符中使用Windows where命令,我可以看到wsl.exe可执行文件的位置。

C:\Users\spike>where wsl
C:\Windows\System32\wsl.exe

以上显示WSL确实存在,并且在我的系统PATH中。当我在Python中使用which函数时,它表示找不到可执行文件。

print(which("wsl"))  # Returns None

为了确保which有效,我在cmd.exe上测试它。

print(which("cmd"))  # Returns "C:\Windows\System32\cmd.exe"

这样可行。好吧,如果我用一个有效的命令进行系统shell调用怎么办?

print(system("where wsl"))  # Returns 1

退出代码1,找不到命令wsl。所以我再次在cmd.exe上测试它。

print(system("where cmd"))  # Returns 0

好的,这样确实有效。问题是什么?

对于每个Python 3示例,假设这些导入。

from shutil import which
from os import system

为什么Python不能找到wsl.exe,即使它被证明存在?

谢谢。

python windows python-3.x shell shutil
1个回答
1
投票

感谢@eryksun,他在评论中帮助解决了这个问题。

问题是我使用的是32位Python,而wsl.exe只在C:/Windows/System32中使用。这个问题是Python正在寻找C:/Windows/SysWOW64来代替可执行文件。

wsl.exe只有64位,你正在寻找SysWOW64而不是真正的System32,因为你使用的是32位Python。 - eryksun

因为WSL只支持64位系统,所以我最终只使用64位Python运行我的代码。但是,如果您只使用Py32,替代解决方案是使用系统根环境变量和SysWOW64直接访问os.path.join

在Windows 7+中,真正的System32目录在32位进程中可以作为“SysNative”访问。遗憾的是,此虚拟目录在本机64位进程中不可用,因此您需要首先检查它是否存在。例如:sysnative = os.path.join(os.environ['SystemRoot'], 'SysNative'); if os.path.exists(sysnative): ...。 - eryksun

© www.soinside.com 2019 - 2024. All rights reserved.