Heim  >  Artikel  >  Java  >  Wie ruft Java Javascript- und Python-Algorithmen auf?

Wie ruft Java Javascript- und Python-Algorithmen auf?

little bottle
little bottlenach vorne
2019-04-28 14:15:102990Durchsuche

In diesem Artikel geht es hauptsächlich um die Verwendung von Java zum Aufrufen von Javascript- und Python-Algorithmen. Interessierte Freunde können mehr darüber erfahren.

In neueren Projekten ist es häufig erforderlich, Algorithmen in Javascript oder Python als Dienste zu veröffentlichen, und die Veröffentlichung von Tomcat-Diensten erfordert den Aufruf dieser Algorithmen in Java, sodass es unvermeidlich ist, Algorithmen sprachübergreifend aufzurufen. Unabhängig davon, ob Sie eine Javascript-Datei oder ein Python-Skript aufrufen, müssen Sie entsprechende Änderungen an der ursprünglichen Algorithmusdatei vornehmen, damit Sie Parameter in Java übergeben und die Ergebnisse der Algorithmusoperation erhalten können.

1. Java ruft Javascript auf

Es ist zu beachten, dass Javascript eine schwach typisierte Sprache ist. In Java müssen Sie jedoch darauf achten Variablentyp und verschiedene Eingaben sind von unterschiedlichem Typ.

Wenn Sie eine JS-Datei aufrufen, müssen Sie diese anpassen und die aufzurufenden Funktionen und zugehörigen Parameter festlegen. Der verwendete JS-Dateicode lautet wie folgt (einige Kernalgorithmen können nicht angezeigt werden):

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;
}

In Es kann über die entsprechende Schnittstelle in Java aufgerufen werden. Der Aufrufcode lautet wie folgt:

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; //返回三维码
    }
}

Die ThreeD_GetBeidouCode-Klasse ist hier nur eine gewöhnliche Klasse und muss in anderen ausführbaren Hauptfunktionen enthalten sein. Rufen Sie die Hauptmethode dieser Klasse auf und übergeben Sie die laufenden Parameter, um das Ergebnis zu erhalten.

2. Java ruft Python auf

Es gibt mehrere Möglichkeiten für Java, Python-Skripte aufzurufen. Die einfachste besteht darin, den Python-Code direkt über Jython auszuführen, aber diese Methode unterstützt nicht den dritten Code, auf den verwiesen wird in Python, also habe ich Runtime verwendet, um die Methode aufzurufen, was der Ausführung des Skripts auf der Konsole entspricht.

Es ist zu beachten, dass beim Java-Aufruf von Python der Rückgabewert nicht über die Return-Anweisung abgerufen werden kann, sondern das Ergebnis nur über print in den Standardausgabestream geschrieben und dann über den Standardeingabestream gelesen werden kann in Java Holen Sie sich das Rückgabeergebnis.

Wenn Anforderungen für die Python-Umgebung bestehen, z. B. die Installation einer Bibliothek eines Drittanbieters, auf die in einer bestimmten Umgebung verwiesen werden muss, müssen Sie dem Java-Projekt auch eine Laufzeitumgebung hinzufügen und auf Ausführen->Ausführen klicken Konfigurationen: Fügen Sie in der Eclipse-Umgebung den Pfad hinzu und legen Sie den Wert auf den Pfad der Python-Installation fest.

Nehmen Sie entsprechende Änderungen im Python-Programm vor: Fügen Sie einen Verweis auf import sys hinzu und setzen Sie die aufgerufenen Funktionsparameter auf sys.argv[1], sys.argv[2].... Beachten Sie, dass die Zählung beginnen muss 1. Verwenden Sie die Druckfunktion, um die Ergebnisse auszudrucken, die zurückgegeben werden müssen.

Der Python-Code in diesem Beispiel lautet wie folgt:

# -*- 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])

Der in Java aufgerufene Code lautet wie folgt:

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; //返回结果
    }
}

Unter den erhaltenen Operationsergebnissen wird jedes Ergebnis in Python gedruckt Entspricht einem in.readLine(), können Sie bei Bedarf die gewünschten Ergebnisse erhalten.

Wenn Sie ein Programm veröffentlichen müssen, das Python als Dienst mit Tomcat aufruft, müssen Sie auch die Tomcat-Betriebsumgebung konfigurieren. Außerdem müssen Sie einen Pfad hinzufügen und ihn dem Python-Installationspfad zuweisen.

Verwandte Tutorials: Java-Video-Tutorial

Das obige ist der detaillierte Inhalt vonWie ruft Java Javascript- und Python-Algorithmen auf?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:cnblogs.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen