在Java中集成python脚本

时间:2018-10-09 19:48:12

标签: java python embed

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

我正在编写一个游戏引擎(并不是真正的目的,我正在尝试许多方法来使某些事情能够通过编程方式进行实践)。为此,我想编写脚本。而且我知道如何从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)对这种情况更好,那么也可以。我在这个问题上完全空白。

1 个答案:

答案 0 :(得分:1)

因此,实际上,使用内置的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并将其放在类路径中,它将起作用。不需要任何函数调用。

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

我的结束代码:

实体类

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

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