7

Cで書かれたグラフライブラリのPythonインターフェース-igraph(ライブラリの名前)があります。このグラフ ライブラリに関連する Python モジュールを Java コードから呼び出す必要があります。このように、ライブラリのコアは c にあります。このコアは Python にインポートされており、コアに組み込まれている関数へのインターフェイスは Python で使用できます。私のプロジェクトの残りのコードは Java であるため、グラフ関数も Java で呼び出したいと考えています。Jython - Java で python モジュールを呼び出すことができるオプションがありました。Jython を試してみたところ、コアコードは C であり、Jython は python で ac dll としてインポートされたものをサポートしないため、私の場合は機能しないことがわかりました。また、c でグラフ ルーチンを直接呼び出す方法を選択することも考えました。つまり、Python コードを通過しません。Java から C コードを呼び出すことができる何かがあるに違いないと思いますが、私は C が得意ではないので、それを選びませんでした。私の最後の手段は、Java を使用してコマンドラインから Python インタープリターを実行するようです。しかし、それは汚くて恥知らずです。また、Python コードによって生成された結果を処理するには、結果をファイルに書き込み、Java で読み戻す必要があります。再び汚れた方法。誰でも私に提案できることはありますか?時間を割いてくださった皆様、ありがとうございました。誰でも私に提案できることはありますか?時間を割いてくださった皆様、ありがとうございました。誰でも私に提案できることはありますか?時間を割いてくださった皆様、ありがとうございました。


Igal さん、ご回答ありがとうございます。私はそれを見ていた。一見、単に python スクリプトを呼び出しているように見えます。

Jep jep = new Jep(false, SCRIPT_PATH, cl);
jep.set("query", query);
jep.runScript(SCRIPT_PATH + file);
jep.close();

コマンドラインからJavaコードを介してpythonインタープリターを呼び出した場合に行うことと非常によく似ています。

Runtime runtime = Runtime.getRuntime();
Process proc = runtime.exec("python test.py");

問題は、Python スクリプトによって生成された結果をどのように使用するかです。単純な方法は、それらをファイルに書き込んで Java で読み戻すことです。よりスマートなアプローチを探しています。とにかく提案をありがとう。

4

3 に答える 3

4

試したことはありません。しかし、私は最近、あなたが興味を持っているかもしれないJeppという名前プロジェクトに出くわしました。

JeppはJavaにCPythonを埋め込みます。スレッドの多い環境で安全に使用でき、非常に高速で、安定性が主な機能であり目標です。

于 2009-01-17T22:36:17.610 に答える
4

JavaからC関数を呼び出したい場合は、おそらくJNA(Java Native Access)が最適です。JNAを使用すると、Cグルーコードを記述せずにネイティブライブラリの関数を呼び出すことができ(JNIを使​​用する場合のように)、JavaとCのプリミティブデータ型間で自動的にマップされます。簡単な例は次のようになります。

import com.sun.jna.Native;
import com.sun.jna.Library;

public class PrintfWrapper {
    public interface CLibrary extends Library {
        CLibrary INSTANCE = (CLibrary)Native.loadLibrary("c", CLibrary.class);
        void printf(String formatString, Object... args);
    }

    public static void main(String[] args) {
        CLibrary.INSTANCE.printf("Hello, world\n");
    }
}

ただし、igraphは、対応するJavaに直接マップできない多くのデータ構造を使用するため、igraphでは事態が複雑になります。igraphのヘッダーファイルからJNAソースを生成できるはずのJNAeratorというプロジェクトがありますが、私はそれを試したことがなく、結果を手動で微調整する必要がある可能性があります。

また、igraph用のJavaインターフェースはゆっくりと、しかし着実に開発されており、数か月かそこらで役立つかもしれないことに注意してください。

于 2010-03-25T00:54:15.133 に答える
2

jep.getValue() を使用して、スクリプトのグローバル ディクショナリから値を取得できます。

Python のスコープ レベルに関する注意事項があるため、ほとんどの人は Java クラスを Python に渡し、Python でそのインスタンスに戻り値を設定する方が明確です。スクリプトが完了すると、Java コードに結果が返されます。

例えば:

==>ジャバ

class ReturnValueClass {
   public int scriptResult;
};
ReturnValueClass value = new ReturnValueClass();
jep.set("retval", value);

==> パイソン

# do something
pass
# write the return value
retval.scriptResult = some_python_value

==>ジャバ

System.out.println(value.scriptResult);

それが役立つことを願って、

マイク (私は Jep を書きました)

于 2012-08-28T21:37:21.970 に答える