在 Java 中集成 python 个脚本

Integrate python scripts within Java

所以,我真的不知道如何正确表述,但我会尽力而为。

我正在编写一个游戏引擎(不是真的为了什么,我正在尝试很多方法来让某些事情通过编程方式进行练习)。为此,我想要编写脚本。我知道如何从 Java 中添加脚本,但我见过使用多种语言的游戏引擎。

所以我想要的是添加 python 来自 Java 进程的 运行 脚本,并且可以与 Java 对象交互。

像这样Java有一些参数的对象(只是一个例子)

public class Entity {

    Script script = new Script ( "example.py" );

    loc_x = 0;
    loc_y = 0;
    loc_z = 0;

    public void update () {
        script.run ();
    }
}

python 脚本是这样的

loc_x += 1
loc_z = loc_x

entity.loc_x += 1
entity.loc_z = entity.loc_x

我只是不知道如何实现它。如果这个问题已经被问过,请告诉我。 If Runtime.getRuntime ().exec ( "example.py" ); 是我对此的最佳选择,没关系。在那种情况下,我只想知道如何共享这些参数。

另外,如果另一种语言(例如;LUA)更适合这样的事情,那也没关系。我对这个问题一无所知。

所以实际上这很简单 Java 从盒子里内置了这个。

Java 有一个叫做 'ScriptEngineManager' 的东西。要使用它,您只需执行以下操作:

ScriptEngineManager sem = new ScriptEngineManager ();
ScriptEngine se = sem.getEngineByName ( "python" );

现在有几种方法可以运行脚本。简单调用 se.eval () 方法。您可以给它一个 String 或一个 Reader,这样它将 运行 脚本。

现在只需使用se.put 方法即可使其具有一些变量。你需要给这两个参数;一个字符串和一个对象。

例如:

se.put ( "entity", entity ); // with entity being defined earlier

唯一要记住的是这个脚本管理器没有内置 python 支持。您需要为此创建自己的 ScriptEngine 或使用第三方软件。我发现 jython 并且这似乎工作得很好。如果您下载独立的 jar 并将其放在您的 class 路径中,它就可以工作。无需任何函数调用。

现在在脚本中您可以调用实体的任何 public 成员。所有对象、值和那些子对象都传递给脚本。

我的结束代码:

实体class

public class Entity {

    String source =
            "entity.loc_x += 1\n" +
            "entity.loc_z = entity.loc_x";
    ScriptEngine se;

    loc_x = 0;
    loc_y = 0;
    loc_z = 0;

    public Entity () {
        ScriptEngineManager sem = new ScriptEngineManager ();
        se = sem.getEngineByName ( "python" );
        se.put ( "entity", this );
    }

    public void update () {
        se.eval ( source );
    }
}

我希望我能帮助到任何人。修补所有这些非常有趣。