>  기사  >  Java  >  Java는 Javascript 및 Python 알고리즘을 어떻게 호출합니까?

Java는 Javascript 및 Python 알고리즘을 어떻게 호출합니까?

little bottle
little bottle앞으로
2019-04-28 14:15:102990검색

이 문서에서는 주로 Java를 사용하여 Javascript 및 Python 알고리즘을 호출하는 방법에 대해 설명합니다. 여기에는 관심 있는 친구들이 배울 수 있는 내용이 있습니다.

최근 프로젝트에서는 Javascript나 Python으로 알고리즘을 서비스로 게시해야 하는 경우가 많고, Tomcat 서비스를 게시하려면 이러한 알고리즘을 Java로 호출해야 하므로 언어를 넘어 알고리즘을 호출하는 것이 불가피합니다. Javascript 파일을 호출하든 Python 스크립트를 호출하든 관계없이 Java에서 매개변수를 전달하고 알고리즘 작업 결과를 얻을 수 있도록 원본 알고리즘 파일을 적절하게 변경해야 합니다.

1. Java는 Javascript를 호출합니다

Javascript는 변수를 정의하는 데 하나의 var만 필요하다는 점에 유의해야 합니다. 그러나 Java에서는 다양한 입력 매개변수에 주의해야 합니다. 다른 유형.

js 파일을 호출할 때 이를 조정하고 호출해야 하는 함수 및 관련 매개 변수를 설정해야 합니다. 사용되는 js 파일 코드는 다음과 같습니다(일부 핵심 알고리즘은 표시할 수 없습니다):

function get3DCode(Latitude,Longitude,Height,level){
    var latcode=[];var lngcode=[];
    latcode=GeoSOTCode1D(Latitude,level);
    lngcode=GeoSOTCode1D(Longitude,level);
    var heicode=[];var geosot3Dcode=[];
    heicode=Altcode(Height,level);
    geosot3Dcode=GeoSOT3D(latcode,lngcode, heicode,level);//三维网格编码
    var d3code=[];
    d3code=getQuantcodeString(geosot3Dcode);
    return d3code;
}

그냥 사용하세요. Java의 해당 인터페이스를 호출하려면 js 파일 경로와 입력 매개변수를 설정해야 합니다. 호출 코드는 다음과 같습니다.

package whu.get.three.beidou;

import java.io.FileReader; 
import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;

/**  * Java调用并执行js文件,传递参数,并获得返回值    */ 
public class ThreeD_GetBeidouCode {
    //获取经纬度及高度,返回三维码
    public static String main(String Latitude,String Longitude,String Height,int CodeSize) throws Exception {      
        //获取经纬度及高度,保存为double类型
        Double latitude = Double.parseDouble(Latitude);
        Double longitude = Double.parseDouble(Longitude);
        Double height = Double.parseDouble(Height);
        int level = CodeSize;

        //调用js文件
        ScriptEngineManager manager = new ScriptEngineManager();   
        ScriptEngine engine = manager.getEngineByName("javascript");     
        String jsFileName = System.getProperty("catalina.home") + "/webapps/3DBeiDouCode/WEB-INF/classes/3Dcode.js";   // 读取js文件
        FileReader reader = new FileReader(jsFileName);   // 执行指定脚本   
        engine.eval(reader); 
        String c = "";
        if(engine instanceof Invocable) {    
            Invocable invoke = (Invocable)engine;    // 调用merge方法,并传入两个参数    
            c = String.valueOf(invoke.invokeFunction("get3DCode", latitude, longitude, height, level));    
            }
        reader.close();  
        return c; //返回三维码
    }
}

여기의 ThreeD_GetBeidouCode 클래스는 이 클래스의 기본 메서드를 호출하면 됩니다. 실행 가능한 다른 주요 기능에서 실행 매개변수를 전달하면 결과를 얻을 수 있습니다.

2. Java가 Python을 호출합니다

Java가 Python 스크립트를 호출하는 방법에는 여러 가지가 있습니다. 가장 간단한 방법은 Jython을 통해 Python 코드를 직접 실행하는 것입니다. 하지만 이 방법은 Python에서 참조하는 타사 라이브러리를 지원하지 않으므로 런타임을 사용했습니다. 메소드를 호출하는 것은 콘솔에서 스크립트를 실행하는 것과 동일합니다.

Java가 Python을 호출할 때 return 문을 통해 반환 값을 얻을 수 없지만 결과는 print를 통해 표준 출력 스트림에만 기록될 수 있으며, 반환 결과는 표준 입력을 통해 읽을 수 있습니다. Java로 스트리밍합니다.

특정 환경에서 참조해야 하는 타사 라이브러리를 설치하는 등 Python 환경에 대한 요구 사항이 있는 경우 Java 프로젝트에 실행 환경도 추가하고 실행->구성 실행->을 클릭해야 합니다. ;eclipse의 환경. 경로를 추가하고 값을 Python 설치 경로로 설정합니다.

파이썬 프로그램에서 적절하게 수정하세요. sys 가져오기에 대한 참조를 추가하고 호출된 함수 매개변수를 sys.argv[1], sys.argv[2]로 설정하세요. 계산은 1부터 시작해야 하며 반환해야 합니다. 결과는 인쇄 기능을 사용하여 인쇄됩니다.

이 예제의 Python 코드는 다음과 같습니다.

# -*- coding:utf-8 -*-
import BaseFunction
import numpy as np
import itertools
import math
import sys
#计算中心要素
def cal_central_feature(path,x,y):
    sf = BaseFunction.open_shpfile(path)
    x_records = BaseFunction.get_attr_records(sf,x)
    y_records = BaseFunction.get_attr_records(sf,y)
    dis = []
    for x0,y0 in zip(x_records,y_records):
        distance = 0
        for x1,y1 in zip(x_records,y_records):
            distance = distance + get_distance(x0,y0,x1,y1)
        dis.append(distance)
    i = dis.index(np.min(dis))
    result = [x_records[i],y_records[i]]
    return result
#计算两点之间的距离
def get_distance(x0,y0,x1,y1):
    xd = x1 - x0
    yd = y1 - y0
    distance = math.sqrt(xd**2+yd**2)
    return distance

if __name__ == '__main__':
    result = cal_central_feature(sys.argv[1],sys.argv[2],sys.argv[3])
    print(result[0])
    print(result[1])

Java에서 호출되는 코드는 다음과 같습니다.

package whu.get.three.beidou;

import java.io.BufferedReader;
import java.io.InputStreamReader;

/**  * Java调用并执行js文件,传递参数,并活动返回值    */ 
public class CalCentralFeatureClass {
    //输入shp路径,获取坐标
    public static String main(String filepath) {
        String pyPath = System.getProperty("catalina.home") + "/webapps/CalCentralFeature/WEB-INF/classes/CalCentralFeature.py"; //python文件路径
        String[] args = new String[] { "python", pyPath, filepath, "x","y"};
        String c = "";  //记录返回值
        try {    
            Process proc = Runtime.getRuntime().exec(args);  //执行py文件
            BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream())); 
            String line = null;
            while ((line = in.readLine()) != null) {
                c = c+line+' ';
            }
            in.close();
            proc.waitFor();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return c; //返回结果
    }
}

얻은 연산 결과 중 Python의 각 인쇄 결과는 in.readLine()에 해당하며, 이를 얻을 수 있습니다. 필요에 따라 원하는 결과를 얻습니다.

Tomcat을 사용하여 Python을 서비스로 호출하는 프로그램을 게시해야 하는 경우 Tomcat 운영 환경도 구성해야 합니다. 또한 Path를 추가하고 Python 설치 경로에 할당해야 합니다.

관련 튜토리얼: Java 비디오 튜토리얼

위 내용은 Java는 Javascript 및 Python 알고리즘을 어떻게 호출합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 cnblogs.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제