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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 07:05:40