目录

JAVARuntime-调用Python脚本可传参

[JAVA]Runtime 调用Python脚本(可传参)

使用场景:在java中通过runtime调用python脚本

1.python脚本中连接Oracle数据库查询数据后输出文件,脚本头内容如下

#!/usr/bin/python3
#encoding=utf-8
import os
from pypinyin import pinyin,lazy_pinyin
import cx_Oracle as oracle
import sys
import pypinyin
import datetime
import redis
import argparse

os.environ["ORACLE_HOME"] = '/Users/apple/Library/Oracle/instantclient_12_2'
os.environ["DYLD_LIBRARY_PATH"] = '/Users/apple/Library/Oracle/instantclient_12_2'
os.environ["LD_LIBRARY_PATH"] = '/Users/apple/Library/Oracle/instantclient_12_2'
os.environ["NLS_LANG"] = 'SIMPLIFIED CHINESE_CHINA.UTF8' #定义脚本说明文案
parser = argparse.ArgumentParser(description='-updateuser:操作用户名') #定义脚本入参
parser.add_argument('-uu', type=str,default=None)

脚本下面的内容都是查询数据库,然后将查询结果输出为文件,就略过了。再补充一下 main 方法的内容

if **name** == '**main**':
args = parser.parse_args()
print(args.uu)
cc = ChineseConvertPinYin()
cc.execute(args.uu)

2.Java 中通过 Runtime 调用执行 python

//设置 java 执行进程的环境变量(临时的)

String[] envp

new String[]{“LD_LIBRARY_PATH=/Users/apple/Library/Oracle/instantclient_12_2”,“LANG=UTF-8”};

//exec 方法 第一个参数是执行的命令,第二个参数为环境变量数据(环境变量设置方式:NAME=VALUE)

Process pr =Runtime. getRuntime ().exec(“python3 /Work/pythonWork/pinyin/ChineseConvertPinYin.py -uu wzj”,envp);

System. out .println(pr.waitFor());//返回 0 表示执行成功,返回 1 表示执行失败(PS:网上看到有数如果执行多条命令的时候,这个 waitFor 必不可少,本次没有实际用途,暂未深入研究)

//获取输出流,即:python 脚本中的 print 或 shell 的 echo

BufferedReader in

new BufferedReader( new InputStreamReader(pr.getInputStream()));

String line

null ;

while ((line = in.readLine()) != null ){

System. out .println(line);//输出每一行打印或 echo

}

//获取异常输出流

BufferedReader ine

new BufferedReader( new InputStreamReader(pr.getErrorStream()));

String linee

null ;

while ((linee = ine.readLine()) != null ){

System. out .println(linee);

}

3.总结

过程中遇到过两个问题:

1.Python 调用 Oracle 连接驱动的问题,使用 pip 安装 cx_Oracle 后,总是报错,大致内容如下:

cx_Oracle.DatabaseError: DPI-1047: 64-bit Oracle Client library cannot be loaded: “dlopen(libclntsh.dylib, 1): image not found”. See for help

解决方式:安装 oracle 连接驱动,此处参考

2.Java Runtime 执行的时候,Python 脚本中的临时环境变量未生效(此处有待后续研究),遂在 java 进程中设置独立环境变量,代码如下:

String[] envp

new String[]{“LD_LIBRARY_PATH=/Users/apple/Library/Oracle/instantclient_12_2”,“LANG=UTF-8”};

3.补充一下,linux or mac 下安装 oracle 驱动包以及环境变量配置(以下代码来源网络)

3.1 下载所需要的驱动包

wget -O /tmp/instantclient-basic-linux.x64-11.2.0.4.0.zip && \

wget -O /tmp/instantclient-sdk-linux.x64-11.2.0.4.0.zip

3.2 解压到指定目录

unzip /tmp/instantclient-basic-linux.x64-11.2.0.4.0.zip -d /usr/local/ && \

unzip /tmp/instantclient-sdk-linux.x64-11.2.0.4.0.zip -d /usr/local/

3.3 建立软连

ln -s /usr/local/instantclient_11_2 /usr/local/instantclient && \

ln -s /usr/local/instantclient/libclntsh.so.11.1 /usr/local/instantclient/libclntsh.so

3.4 配置环境变量

echo “LD_LIBRARY_PATH=/usr/local/instantclient:$LD_LIBRARY_PATH” » .bash_profile

echo “PATH=$PATH:/usr/local/instantclient” » .bash_profile

echo “export LD_LIBRARY_PATH PATH” » .bash_profile

3.5 使环境变量生效

source .bash_profile