Windows下Python Subprocess调用命令行抛出[WinError 2]异常求助
解决Subprocess调用命令行抛出[WinError 2]的问题
问题根源
- 多命令未通过Shell解析:你用
cd && es.exe这种多命令组合,subprocess默认不会调用系统shell(比如cmd.exe)来解析命令链,导致无法识别连续命令。 - 路径拼接错误:代码里
cd "+os.getcwd() +" Everything-CLI会把当前目录和Everything-CLI直接拼接,变成类似cd C:\testEverything-CLI的错误路径,系统找不到这个目录。 - es.exe路径识别问题:如果
es.exe不在系统环境变量PATH里,直接写es.exe会导致系统找不到该可执行文件。
修正方案
方案1:修正命令格式并启用Shell模式
把命令改成正确的路径拼接,同时指定shell=True让subprocess通过cmd解析多命令:
import subprocess import os class SlnFinder: def __init__(self): self.AllSln = {} def Get_All_Sln(self): # 正确拼接Everything-CLI的目录路径 cli_dir = os.path.join(os.getcwd(), "Everything-CLI") # 构造命令:先进入指定目录,再执行搜索 cmd = f'cd "{cli_dir}" && es.exe "*.sln"' # 启用shell=True,让cmd解析连续命令 raw_sln_paths = subprocess.check_output(cmd, shell=True).decode('utf-8').split("\n") # 过滤空字符串,避免无效路径 raw_sln_paths = [path.strip() for path in raw_sln_paths if path.strip()] self.AllSln["paths"] = raw_sln_paths
方案2:直接指定es.exe绝对路径(更可靠)
如果不想依赖shell,或者担心环境变量PATH的问题,直接用es.exe的绝对路径调用,同时用cwd参数指定工作目录,省去cd命令:
import subprocess import os class SlnFinder: def __init__(self): self.AllSln = {} def Get_All_Sln(self): # 获取es.exe的绝对路径 es_exe_path = os.path.join(os.getcwd(), "Everything-CLI", "es.exe") # 用cwd参数指定搜索的根目录,无需cd命令 raw_sln_paths = subprocess.check_output( [es_exe_path, "*.sln"], cwd=os.getcwd() ).decode('utf-8').split("\n") # 过滤空字符串 raw_sln_paths = [path.strip() for path in raw_sln_paths if path.strip()] self.AllSln["paths"] = raw_sln_paths
额外注意事项
- 确认
Everything-CLI文件夹确实在当前工作目录下,或者替换成实际的绝对路径。 - 如果仍然报错,检查
es.exe是否存在、文件权限是否正常。
内容的提问来源于stack exchange,提问作者gaviezri
相关产品推荐
相关产品推荐

