繁体   English   中英

在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并将其放在类路径中,它将起作用。 无需任何函数调用。

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

我的结束码:

实体类

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM