在 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 );
}
}
我希望我能帮助到任何人。修补所有这些非常有趣。
所以,我真的不知道如何正确表述,但我会尽力而为。
我正在编写一个游戏引擎(不是真的为了什么,我正在尝试很多方法来让某些事情通过编程方式进行练习)。为此,我想要编写脚本。我知道如何从 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 );
}
}
我希望我能帮助到任何人。修补所有这些非常有趣。