Windows下Python调用Git Bash执行Java算法脚本报错求助
问题:Python调用Bash脚本执行Java程序时找不到主类
在Windows的Git Bash环境中,手动执行bash_script.sh可正常运行Java策略挖掘算法,但通过Python脚本调用时抛出以下错误:
Error: Could not find or load main class edu.dar.algo.Experiment
Caused by: java.lang.ClassNotFoundException: edu.dar.algo.Experiment
相关文件与目录结构
目录结构
case-studies/ -- temp_check.abac lib/ -- commons-math-2.2.jar -- commons-math3-3.3.jar src/ bin/ compile.sh run python_script.py bash_script.sh temp_output.txt
原Python脚本
import os import subprocess os.environ['PATH'] = 'C:/Program Files/Java/jdk-15.0.1/bin/java.exe' + os.environ['PATH'] bash_command = "./bash_script.sh" subprocess.run(["bash", "-c", bash_command])
bash_script.sh
#!/bin/bash # Compile ./compile.sh # Run using the input file ./run -m ../case-studies/temp_check.abac -verbose >> temp_output.txt
原run脚本
#!/bin/bash cd bin java -cp "../lib/commons-math-2.2.jar;../lib/commons-math3-3.3.jar;." edu.dar.algo.Experiment $* cd ..
修复方案
1. 修正PATH环境变量与工作目录
原代码错误地将java.exe路径直接拼入PATH,且未指定正确工作目录,修改后Python脚本如下:
import os import subprocess # 正确添加Java的bin目录到PATH,使用系统路径分隔符 os.environ['PATH'] = 'C:/Program Files/Java/jdk-15.0.1/bin' + os.pathsep + os.environ['PATH'] bash_command = "./bash_script.sh" # 替换为你的仓库根目录绝对路径,确保相对路径生效 subprocess.run(["bash", "-c", bash_command], cwd="C:/your/repository/absolute/path")
2. 修复run脚本的类路径分隔符
Git Bash模拟Unix环境,类路径分隔符需用冒号(:)而非Windows的分号(;),修改run脚本:
#!/bin/bash cd bin # 替换分号为冒号,适配Git Bash环境 java -cp "../lib/commons-math-2.2.jar:../lib/commons-math3-3.3.jar:." edu.dar.algo.Experiment $* cd ..
3. 增加编译失败校验(可选)
在bash_script.sh中添加编译结果检查,避免编译失败后继续执行运行命令:
#!/bin/bash # 编译并检查执行结果 if ! ./compile.sh; then echo "编译失败,终止执行" exit 1 fi # 运行程序 ./run -m ../case-studies/temp_check.abac -verbose >> temp_output.txt
原因说明
- PATH设置错误:原代码将具体的
java.exe路径加入PATH,导致系统无法识别javac等Java工具的位置。 - 路径分隔符不匹配:Git Bash环境需使用Unix风格的冒号作为类路径分隔符,而非Windows的分号。
- 工作目录不一致:Python脚本默认工作目录可能与手动执行Git Bash时不同,通过
cwd参数强制指定仓库根目录可解决相对路径失效问题。
内容的提问来源于stack exchange,提问作者Gaurav
相关产品推荐
相关产品推荐

