java 调用 python脚本并传递参数list

项目需求:需要java调用python脚本,而且需要向脚本中传递参数,经过很长时间的摸索之后研究出了点东西,因为实在没有老师教,所以只能摸索出了最笨的方法,现在记录下来,希望大家有好的方法多多指教。

1、执行单行代码,使用Jython

        <!--jython-->
		<!-- https://mvnrepository.com/artifact/org.python/jython-standalone -->
		<dependency>
			<groupId>org.python</groupId>
			<artifactId>jython-standalone</artifactId>
			<version>2.7.1</version>
		</dependency>
/**
     * 执行单行代码
     */
    @Test
    public void test1_code(){
        PythonInterpreter pythonInterpreter=new PythonInterpreter();
        pythonInterpreter.exec("print('-----执行单行代码:Hello')");
    }

2、执行文件脚本,有函数名不带参数,而且不引用三方库,使用Jython

hello.py:

def hello():
    return '----py文件执行结果:Hello'
/**
     * 执行文件脚本,有函数名不带参数,不使用三方库
     */

    @Test
    public void test2_file(){
        PythonInterpreter pythonInterpreter=new PythonInterpreter();
        //注意这边要用绝对路径
        pythonInterpreter.execfile("E:\\mlthfs\\src\\main\\resources\\pythonDemo\\hello.py");
        //第一个参数为期望获得的函数(变量)的名字,第二个参数为期望返回的对象类型
        PyFunction pyFunction=pythonInterpreter.get("hello",PyFunction.class);
        //调用函数,此时call无参数
        PyObject pyObject=pyFunction.__call__();
        System.out.println(pyObject);
    }

3、执行文件脚本,由函数名,带参数,不用三方库,Jython

testWithParam.py:

def my_test(name, age):
    print("name: "+name)
    print("age: "+age)
    return "success"
 /**
     * 执行文件脚本,由函数名,带参数
     */
    @Test
    public void test3_Param(){
        PythonInterpreter interpreter=new PythonInterpreter();
        interpreter.execfile("E:\\mlthfs\\src\\main\\resources\\pythonDemo\\testWithParam.py");
        PyFunction pyFunction=interpreter.get("my_test",PyFunction.class);
        //调用函数,此时call传入两个参数
        PyObject pyObject=pyFunction.__call__(new PyString("tom"),new PyString("25"));
        System.out.println(pyObject.toString());
    }

4、调用脚本,使用三方库,传递参数list,脚本接收一维数组,

说明一下,python脚本中需要接收两个一维数组作为数据输入,我的思路是从java中传入list,然后再在ppython中做处理将传进去的参数转为数组,进行运算。

传参数的时候只能将所有的参数组合成一个字符串,实质是cmd命令行。

接收的时候使用sys.argv方法接收脚本外传入的参数,并且组成一个列表list,第一个元素是命令行,从第二个开始就是传入的list参数,使用print(sys.argv[1:])打印出来就是:

sys.argv[1:]== ['[3340,', '4525,', '7304,', '3335,', '5319,', '5319,', '3932,', '3932,', '4]']

现在看来格式很乱。需要根据需要处理:具体在脚本中体现,不一一赘述。

 Process process = Runtime.getRuntime().exec(
                    pythonPath + filePath + list1);
public void test6_ThirdPackage_param()  {
        String pythonPath="D:\\Program Files\\P
  • 5
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值