subprocess.Popen执行gradle命令报FileNotFoundError但os.system可正常运行
Windows下subprocess.Popen执行gradle命令报FileNotFoundError,但os.system和CMD正常的解决方法
问题核心原因
Windows系统中,subprocess.Popen默认会直接查找可执行文件(.exe格式),不会自动识别PATH中的.bat/.cmd脚本;而os.system和原生CMD会调用shell解析命令,能自动匹配到gradle.bat脚本。
- node、python的
subprocess.Popen能正常运行,是因为它们的可执行文件是.exe格式,Python可直接在PATH中找到; - 那台通过chocolatey安装gradle的机器能正常运行,是因为chocolatey在
C:\ProgramData\chocolatey\bin下生成了gradle.exe包装器(实际调用背后的bat脚本),Python能直接识别这个exe文件。
解决方案
方案1:显式调用CMD执行命令
让CMD来解析bat脚本,推荐拆分参数的写法更安全:
import subprocess p = subprocess.Popen(["cmd", "/c", "gradle", "--version"], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True) output, err = p.communicate() print(f"return code: {p.returncode}") print(output)
方案2:添加shell=True参数
让subprocess.Popen调用系统shell(Windows下为CMD)执行命令,行为和os.system一致:
import subprocess p = subprocess.Popen("gradle --version", stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True, text=True) output, err = p.communicate() print(f"return code: {p.returncode}") print(output)
注意:
shell=True存在命令注入风险,若命令包含不可信输入,请勿使用此方案。
方案3:手动生成gradle.exe包装器
模仿chocolatey的做法,用工具将gradle.bat转为exe格式,把该exe所在路径加入系统PATH,这样subprocess.Popen("gradle --version")就能直接识别到可执行文件。
内容的提问来源于stack exchange,提问作者solidius
相关产品推荐
相关产品推荐

