Linux

关注公众号 jb51net

关闭
首页 > 网站技巧 > 服务器 > Linux > Linux Bash调用Python和Java代码

Linux Bash调用Python和Java代码过程

作者:fengyehongWorld

本文介绍了如何在Linux和Windows系统中使用Bash调用Python和Java程序,并详细解释了Bash脚本中的命令与路径判断、调用Python和Java代码以及重点语法解析

一. 前提条件

PythonSource.py

import sys

# python代码进行计算
x = 10
# 打印需要被bash获取的信息
print(x * 2)

"""
设置返回码
    成功返回 0
    失败返回 1
"""
sys.exit(0)

JavaSource.java

public class JavaSource {

    public static void main(String[] args) {
        // 打印需要被Bash获取的信息
        int x = 10;
        System.out.println(x * 2);
        // 设置退出码, 方便Bash获取java程序的执行结果
        System.exit(0);            
    }
}

Windows上虽然无法直接使用Bash,但是基本上程序员的电脑上都会安装Git,通过Git for Bash可以使用Bash,上述语言书写的程序就可以通过Bash来直接双击.sh文件来执行了。

二. Bash代码实现

2.1 命令与路径判断部分

#!/usr/bin/env bash

# 判断java命令是否被安装
if ! command -v java >/dev/null 2>&1; then
    echo "【java】命令并没有被安装, 请确认!"
    exit 1
fi

# 判断python命令是否被安装
if ! command -v python >/dev/null 2>&1; then
    echo "【python】命令并没有被安装, 请确认!"
    exit 1
fi

# 获取当前脚本的绝对路径
SCRIPT_PATH="$(readlink -f "${BASH_SOURCE[0]}")"
# 根据脚本的绝对路径获取脚本所在目录的绝对路径
SCRIPT_DIR="$(dirname "$SCRIPT_PATH")"

# 拼接python代码所在的路径
PYTHON_FILE_PATH="$SCRIPT_DIR/00-source/PythonSource.py"
# 拼接java代码所在的路径
JAVA_FILE_PATH="$SCRIPT_DIR/00-source/JavaSource.java"

2.2 调用Python代码部分

# 在bash中调用python代码, 获取其输出值和退出码
python_result=$(python "$PYTHON_FILE_PATH")
# 获取退出码必须要在获取返回值之前, 否则echo命令打印了返回值之后, Bash捕获的就不是python的退出码而是echo命令的执行状态了
echo "Python程序的退出码是: $?"
# 获取python的打印值
echo "Python程序的结果是: $python_result"

2.3 调用Java代码部分

# 进入 Java 文件所在目录
#   $(dirname $JAVA_FILE_PATH) → 获取 Java 文件所在目录
#   pushd <dir>                → 切换到指定目录,同时把当前目录 压入目录栈
#   >/dev/null                 → 屏蔽 pushd 输出
#   || exit 1                  → 如果目录不存在或切换失败,退出脚本
pushd "$(dirname $JAVA_FILE_PATH)" >/dev/null || exit 1

# 编译java代码(指定使用UTF-8编译, 防止windows中默认使用GBK编码)
# 编译之后会在当前目录下生成一个.class文件
javac -encoding UTF-8 "$JAVA_FILE_PATH"
if [ $? -ne 0 ]; then
    echo "编译失败!"
    # popd → 从目录栈弹出上一个目录,并切换回去
    # >/dev/null → 屏蔽输出
    popd >/dev/null
    exit 1
fi

# 从绝对路径中获取java不带后缀的文件名
JAVA_FILE_BASENAME=$(basename "$JAVA_FILE_PATH" '.java')
echo '____________________________________'
echo "$JAVA_FILE_PATH"
echo "$JAVA_FILE_BASENAME"
echo '‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾'

# 执行编译后的java代码
java_result=$(java "$JAVA_FILE_BASENAME")
echo "Java程序的退出码是: $?"
# 获取java的打印值
echo -e "java程序的结果是: $java_result\n"

# 删除生成的.class文件
sleep 2
rm "${JAVA_FILE_BASENAME}.class"

# 返回到原目录
popd >/dev/null

# 退出
read -p "→ 脚本执行结束, 按任意键结束 . . . " -n1 -s

三. 重点语法解析

获取当前脚本的绝对路径和脚本所在的目录

SCRIPT_PATH="$(readlink -f "${BASH_SOURCE[0]}")"
SCRIPT_DIR="$(dirname "$SCRIPT_PATH")"

移动到指定目录后,退回到原目录

pushd "$(dirname $JAVA_FILE_PATH)" >/dev/null || exit 1
popd >/dev/null

java并不是脚本语言,必须先编译才能使用

# 编译.java文件为.class文件
javac -encoding UTF-8 "$JAVA_FILE_PATH"
# 调用编译好的文件,执行java代码
java_result=$(java "$JAVA_FILE_BASENAME")

阻塞窗口,让使用者看到脚本执行结束的信息提示。

在读取输入前,显示提示信息。

只读取 1 个字符 就结束输入(而不是等用户按回车)。

所以用户按下任意键(比如 a、空格 等)就会立即继续。

silent 模式,输入时不会在终端上显示出来。

read -p "→ 脚本执行结束, 按任意键结束 . . . " -n1 -s

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文