java调用Python 传递参数

xiaoxiao2021-02-28  51

==

Java调用Python程序

最近,需要在应用中,需要使用Java程序去调用Python代码,主要有两种实现方式。

一、使用Jython架包

因为调用的Python代码中需要使用Json对象,开始使用jython2.5.2,发现不支持json。因此,

升级了最新的Jython2.7.0,发现可以支持。因此,要使用更多python库,建议使用更高版本的Jython包。

首先,添加Jython的Maven依赖:

其后,写了一个简单的测试程序:

其后,可以得到如下结果:

二、使用Runtime.getRuntime()执行脚本文件

这种方式和cmd中使用python+文件名的命令调用python程序相同

其中,Python程序如下:

执行结果和Jython执行结果一样。

==

1、安装Eclipse

先安装jdk,再安装Eclipse,成功后开始建立py_java项目,在这个项目的存储目录SRC下建立test包,在test包中New-Class,新建MyDemo类,建好完成后就可以在MyDemo中写代码了

2、python脚本内容

1 2 3 4 5 6 7 8 9 10 11 12 13 import  numpy as np from  selenium  import  webdriver     def  main():      url  =  'https://www.tianyancha.com/login'      driver  =  webdriver.Chrome()      driver.get(url) if  __name__  = =  '__main__' :      a  =  np.ones( 3 )      print (a)      print ( 'java 调用有第三方库的python脚本成功' )      main()

  调用了两个三方库,有输出操作和打开浏览器操作

3、MyDemo类的代码(java调用python脚本)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 package  test; import  java.io.BufferedReader; import  java.io.InputStreamReader; public  class  MyDemo {            public  static  void  main(String[] args) {          try  {             System.out.println( "start" );             String[] args1= new  String[]{ "python" , "D:\\pyworkpeace\\9_30_1.py" };             Process pr=Runtime.getRuntime().exec(args1);                          BufferedReader in =  new  BufferedReader( new  InputStreamReader(               pr.getInputStream()));             String line;             while  ((line = in.readLine()) !=  null ) {              System.out.println(line);             }             in.close();             pr.waitFor();             System.out.println( "end" );            }  catch  (Exception e) {             e.printStackTrace();            }}      public  void  test(){          System.out.println( "我的第一个方法C" );      }   }

  

4、运行结果如下所示

不光有打印窗口,而且还弹出了天眼查的浏览器,程序完成后浏览器也就关闭了

5、java动态传递参数

    这次要做的是通过java传递url给python脚本,而python脚本用浏览器打开接收到的url网页。

(1)首先定义一个url参数在java中 ;String url="http://blog.csdn.net/thorny_v/article/details/61417386";

(2)将参数传递给python;  String[] args1 = new String[] { "python", "D:\\pyworkpeace\\9_30.py", url}; 

java中其他地方完全一样 没有改动

(3)python中需要做一点小变动,重写了一下代码

1 2 3 4 5 6 7 8 9 10 11 import  sys from  selenium  import  webdriver     def  main(a):      driver  =  webdriver.Chrome()   # 打开浏览器      driver.get(a)   # 浏览器打开指定页面 if  __name__  = =  '__main__' :      for  i  in  range ( 1 ,  len (sys.argv)):          url  =  sys.argv[i]          main(url)

  其中需要注意的是接收参数从sys.argv[1]开始,sys.argv[0]是python脚本的参数地址,没什么用。最后就大功告成了

//这个程序可以调用python脚本,并向python脚本中传递参数 package test; import java.io.BufferedReader; import java.io.InputStreamReader; public class test_1 { public static void main(String[] args) { try { //String a=getPara("car").substring(1),b="D34567",c="LJeff34",d="iqngfao"; //String[] args1=new String[]{ "python", "D:\\pyworkpeace\\9_30_1.py", a, b, c, d }; //Process pr=Runtime.getRuntime().exec(args1); String url="http://blog.csdn.net/thorny_v/article/details/61417386"; System.out.println("start;"+url); String[] args1 = new String[] { "python", "D:\\pyworkpeace\\9_30.py", url}; Process pr=Runtime.getRuntime().exec(args1); BufferedReader in = new BufferedReader(new InputStreamReader( pr.getInputStream())); String line; while ((line = in.readLine()) != null) { System.out.println(line); } in.close(); pr.waitFor(); System.out.println("end"); } catch (Exception e) { e.printStackTrace(); } } private static String getPara(String string) { // TODO Auto-generated method stub return null; }

}  

转载请注明原文地址: https://www.6miu.com/read-2612491.html

最新回复(0)