Java调用shell脚本及参数传递

项目需求是Java调用Python脚本获取结果并展示,但现有方式以脚本调用且写入固定文件,仅适用于单线程,并发会出错。Java应先调用shell脚本,再由其调用Python脚本,参数传递要用String数组。非特殊情况,不推荐此方式,建议提供Http接口。

Java调用shell脚本及参数传递

需求

项目需求:由于Python没有提供Http请求的接口,而是以脚本的方式调用,Java需要调用pyhon脚本得到结果返回写入文件,然后Java再读取写入的文件,拿到结果页面展示。
坑:这种方式适合单线程模式,不是个多个请求并发,写入的文件是固定的,并发情况下,第一的请求如果读取的是第二次请求的结果,就会有问题。

脚本示例

Java代码不是直接调用python脚本,而是先调用shell脚本,shell脚本再调用python脚本,Java如果直接调用python会出一些问题。

#!/bin/bash
python xx/xx/xx/xx.py -a $1 -b $2 -c $3

执行代码封装工具类

这里参数的传递必须使用String数组的形式进行传递,如果直接传递下面的命令会造成有的脚本好用,有的出错。
bashCommand示例(参数用空格间隔):

sh xx/xx/xx/xx.sh "a1" "a2" "a3"
public class ExecUtil {
	/**
	 * 执行Shell脚本 0成功 1失败
	 */
	public static int execSh(String bashCommand) throws IOException, InterrruptedException {
		Runtime runtime = Runtime.getRuntime();
		String[] bash = {"/bin/bash", "-c", bashCommand};
		Process exec = runtime.exec(bash);
		int status = exec.waitFor();
		if(status != 0) {
			return 1;
		}
		return status;
	}
}

最后

不是特殊情况,不推荐Java这样调用Python,最好还是能提供一个Http接口进行调用。

### 在 Java调用 Shell 脚本递参数的方法 在 Java调用 Shell 脚本递参数,可以使用 `Runtime.exec()` 或 `ProcessBuilder`。以下是两种方法的具体实现和注意事项。 #### 方法一:使用 `Runtime.exec()` 通过 `Runtime.exec()` 方法,可以将脚本名称和参数作为字符串数组递给 Shell 脚本[^1]。以下是一个示例代码: ```java public class ShellScriptWithParameters { public static void main(String[] args) { try { // 定义要执行的命令和参数 String[] commands = { "/bin/bash", "-c", "test.sh", "param1", "param with space" }; // 创建进程 Process process = Runtime.getRuntime().exec(commands); // 等待进程结束 process.waitFor(); } catch (Exception e) { e.printStackTrace(); } } } ``` 在此示例中,`test.sh` 是目标脚本,`param1` 和 `param with space` 是递给脚本的参数。注意,如果参数包含空格,直接递即可,无需额外处理。 #### 方法二:使用 `ProcessBuilder` `ProcessBuilder` 提供了更灵活的方式,允许设置工作目录、环境变量等。以下是一个示例代码: ```java import java.io.BufferedReader; import java.io.InputStreamReader; public class ShellScriptWithParameters { public static void main(String[] args) { try { // 创建 ProcessBuilder 实例 ProcessBuilder processBuilder = new ProcessBuilder("/bin/bash", "test.sh", "param1", "param with space"); // 设置工作目录(可选) processBuilder.directory(new java.io.File("/path/to/directory")); // 启动进程 Process process = processBuilder.start(); // 读取标准输出 BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); String line; while ((line = reader.readLine()) != null) { System.out.println(line); } // 等待进程结束 process.waitFor(); } catch (Exception e) { e.printStackTrace(); } } } ``` 在此示例中,`ProcessBuilder` 的构造函数接收脚本路径和参数。与 `Runtime.exec()` 类似,参数中的空格会被正确处理[^3]。 #### 注意事项 - 如果需要递的参数包含特殊字符(如 `$`, `&`, `*`),建议对参数进行转义或使用引号包裹[^2]。 - 在某些情况下,Java 可能无法正确解析 Shell 语法或环境变量。这是因为 Java 不会自动加载 Shell 的初始化脚本。如果需要更复杂的环境配置,可以考虑为脚本手动设置所需的环境变量[^3]。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值