JavaがPythonコードとファイルを呼び出す方法(転載)


Javaクラスでpython文を直接実行する
このメソッドはorg.pythonパッケージを参照する必要があり、Jpythonをダウンロードする必要があります.ここではまずJpythonについて紹介します.百科事典の説明を以下に導入します.
  • JythonはJava翻訳機ではなく、Pythonコンパイラではなく、Python言語がJavaで完全に実現されています.JythonにもCPythonから引き継いだモジュールライブラリがたくさんあります.最も興味深いことに、JythonはCPythonや他の高級言語とは異なり、言語へのすべてのアクセスを提供しています.だからJythonはあなたにPythonのライブラリを提供しただけでなく、すべてのJavaクラスも提供しました.これにより、巨大なリポジトリが作成されます.

  • ここでは、使用可能なpython関数ライブラリが古いバージョンよりも多く、現在の最新バージョンは2.7であるため、最新バージョンのJpythonをダウンロードすることをお勧めします.  jarパッケージをダウンロードするにはDownload Jython 2.7.0-Standalone Jarをクリックしてください  インストールプログラムをダウンロードするにはDownload Jython 2.7.0-Installerをクリックしてください  maven依存を使用して追加する場合は、次の文を使用します.
    
        org.python
        jython-standalone
        2.7.0
    
    

    以上の準備ができたら、javaクラスにpython文を直接書くことができます.具体的なコードは以下の通りです.
    PythonInterpreter interpreter = new PythonInterpreter();
    interpreter.exec("a=[5,2,3,9,4,0]; ");
    interpreter.exec("print(sorted(a));");  //  python   3.x     
    interpreter.exec("print sorted(a);");   //   python   2.x     
    

    Javaでローカルpythonスクリプトを呼び出す
    まず、add.pyという名前のpythonスクリプトをローカルに作成し、単純な2つの数を加算する関数を書きました.コードは次のとおりです.
    def add(a,b):
        return a + b
    

    pythonの機能関数はすでに書き終わりました.次にjavaのテストクラス(同じようにJpythonパッケージを使用する必要があります)を書いて、正常に実行できるかどうかをテストします.コードは次のとおりです.
    import org.python.core.PyFunction;
    import org.python.core.PyInteger;
    import org.python.core.PyObject;
    import org.python.util.PythonInterpreter;
     
    public class Java_Python_test {
     
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            PythonInterpreter interpreter = new PythonInterpreter();
            interpreter.execfile("D:\\add.py");
     
            //              (  )   ,               
            PyFunction pyFunction = interpreter.get("add", PyFunction.class);
            int a = 5, b = 10;
            //    ,        , Java             “Python  ”
            PyObject pyobj = pyFunction.__call__(new PyInteger(a), new PyInteger(b)); 
            System.out.println("the anwser is: " + pyobj);
        }
    }
    

    注意:以上の2つのメソッドはpythonプログラムを呼び出すことができますが、Jpythonで呼び出されるpythonライブラリは多くありません.以上の2つのメソッドで呼び出され、pythonのプログラムでサードパーティのライブラリに使用されると、java ImportError:No module named xxxとエラーが表示されます.このような場合は、以下の方法を推奨し、この問題を解決することができます.
    Runtime.getRuntime()を使用してスクリプトファイルを実行する(推奨)
    このメソッドがpythonサードパーティ製ライブラリを含むプログラムを実行できることを確認するには、次のような簡単なpythonスクリプトを書きます.
    import numpy as np
     
    a = np.arange(12).reshape(3,4)
    print(a)
    

    プログラムでnumpyサードパーティライブラリが使用され、3が初期化されていることがわかります.×4の行列です.  次に、Runtime.getRuntime()メソッドを使用してpythonプログラムを呼び出し、その結果を出力する方法を見てみましょう.javaコードは次のとおりです.
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
     
    public class Demo1 {
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            Process proc;
            try {
                proc = Runtime.getRuntime().exec("python D:\\demo1.py");//   py  
                //           
                BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream()));
                String line = null;
                while ((line = in.readLine()) != null) {
                    System.out.println(line);
                }
                in.close();
                proc.waitFor();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (InterruptedException e) {
                e.printStackTrace();
            } 
        }
    }
    

    pythonプログラムで関数がパラメータを渡し、結果を実行します.
    import sys
     
    def func(a,b):
        return (a+b)
     
    if __name__ == '__main__':
        a = []
        for i in range(1, len(sys.argv)):
            a.append((int(sys.argv[i])))
     
        print(func(a[0],a[1]))
    

    ここでsys.argvは、パラメータurl 1,url 2などを取得するために使用される.sys.argv[0]はpythonプログラム名を表すので、リストは1からパラメータの読み取りを開始します.  以上のコードは2つの数を加算するプログラムを実現し、javaで関数パラメータをどのように伝達するかを見てみましょう.コードは以下の通りです.
    int a = 18;
    int b = 23;
    try {
        String[] args = new String[] { "python", "D:\\demo2.py", String.valueOf(a), String.valueOf(b) };
        Process proc = Runtime.getRuntime().exec(args1);//   py  
     
        BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream()));
        String line = null;
        while ((line = in.readLine()) != null) {
            System.out.println(line);
        }
        in.close();
        proc.waitFor();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    

    ここでargsはString[{"python",path,url 1,url 2};pathはpythonプログラムが存在するパスであり、url 1はパラメータ1であり、url 2はパラメータ2である.
    転載先http://blog.csdn.net/it_xiao_bai/article/details/79074988