Java 尝试设置Jython解释器时出错
我想在插件中启动Jython解释器,然后在解释器中执行文件Java 尝试设置Jython解释器时出错,java,python,inputstream,jython,Java,Python,Inputstream,Jython,我想在插件中启动Jython解释器,然后在解释器中执行文件 package com.jakob.jython; import org.bukkit.plugin.java.JavaPlugin; import org.python.core.PyObject; import org.python.util.PythonInterpreter; import java.io.IOException; import java.io.InputStream; import java.util.lo
package com.jakob.jython;
import org.bukkit.plugin.java.JavaPlugin;
import org.python.core.PyObject;
import org.python.util.PythonInterpreter;
import java.io.IOException;
import java.io.InputStream;
import java.util.logging.Logger;
public class EmbeddedJython extends JavaPlugin {
private static final Logger log = Logger.getLogger("Minecraft");
private PythonInterpreter interpreter;
private PyObject plugin;
public void onEnable() {
log.info("JythonTest enabled");
this.interpreter = new PythonInterpreter();
log.info("Jython interpreter fired up and cooking on gas");
log.info("Loading Python Plugin");
InputStream pythonScript = EmbeddedJython.class.getResourceAsStream("MyPlugin.py");
this.interpreter.execfile(pythonScript, "MyPlugin.py");
log.info("Getting plg method.");
this.plugin = this.interpreter.get("plg");
log.info("Plugin loaded");
log.info(plugin.invoke("onEnable").toString());
}
public void onDisable() {
log.info(plugin.invoke("onDisable").toString());
log.info("Jython disabled");
}
}
在其他测试中,我可以启动Jython解释器并运行字符串,但当我使用上面的代码段时,我最终会遇到一个异常,类似如下所示:
11:03:38[严重]启用JythonTest v0.12时发生错误(是否由da决定
te?:空
java.io.IOException:流已关闭
位于java.io.BufferedInputStream.getInIfOpen(未知源)
位于java.io.BufferedInputStream.fill(未知源)
位于java.io.BufferedInputStream.read(未知源)
位于org.python.core.ParserFacade.adjustForBOM(ParserFacade.java:371)
位于org.python.core.ParserFacade.prepBufReader(ParserFacade.java:298)
位于org.python.core.ParserFacade.prepBufReader(ParserFacade.java:288)
位于org.python.core.ParserFacade.parse(ParserFacade.java:183)
在org.python.core.Py.compile_标志处(Py.java:1717)
位于org.python.util.PythonInterpreter.execfile(PythonInterpreter.java:235
)
位于com.jakob.jython.EmbeddedJython.oneable(EmbeddedJython.java:26)
位于org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:125)
在org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader
.java:750)
在org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager
r、 爪哇:253)
位于org.bukkit.craftbukkit.CraftServer.loadPlugin(CraftServer.java:132)
位于org.bukkit.craftbukkit.CraftServer.loadPlugins(CraftServer.java:110)
位于net.minecraft.server.MinecraftServer.e(MinecraftServer.java:218)
位于net.minecraft.server.MinecraftServer.a(MinecraftServer.java:205)
位于net.minecraft.server.MinecraftServer.init(MinecraftServer.java:145)
位于net.minecraft.server.MinecraftServer.run(MinecraftServer.java:265)
位于net.minecraft.server.ThreadServerApplication.run(源文件:394)
java.io.IOException:java.io.IOException:流已关闭
位于org.python.core.PyException.fillInStackTrace(PyException.java:70)
位于java.lang.Throwable。(Throwable.java:181)
位于java.lang.Exception。(未知源)
位于java.lang.RuntimeException。(未知源)
位于org.python.core.PyException(PyException.java:46)
位于org.python.core.PyException(PyException.java:43)
位于org.python.core.Py.JavaError(Py.java:481)
位于org.python.core.ParserFacade.fixParseError(ParserFacade.java:104)
位于org.python.core.ParserFacade.parse(ParserFacade.java:186)
在org.python.core.Py.compile_标志处(Py.java:1717)
位于org.python.util.PythonInterpreter.execfile(PythonInterpreter.java:235
)
位于com.jakob.jython.EmbeddedJython.oneable(EmbeddedJython.java:26)
位于org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:125)
在org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader
.java:750)
在org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager
r、 爪哇:253)
位于org.bukkit.craftbukkit.CraftServer.loadPlugin(CraftServer.java:132)
位于org.bukkit.craftbukkit.CraftServer.loadPlugins(CraftServer.java:110)
位于net.minecraft.server.MinecraftServer.e(MinecraftServer.java:218)
位于net.minecraft.server.MinecraftServer.a(MinecraftServer.java:205)
位于net.minecraft.server.MinecraftServer.init(MinecraftServer.java:145)
位于net.minecraft.server.MinecraftServer.run(MinecraftServer.java:265)
位于net.minecraft.server.ThreadServerApplication.run(源文件:394)
原因:java.io.IOException:流已关闭
位于java.io.BufferedInputStream.getInIfOpen(未知源)
位于java.io.BufferedInputStream.fill(未知源)
位于java.io.BufferedInputStream.read(未知源)
位于org.python.core.ParserFacade.adjustForBOM(ParserFacade.java:371)
位于org.python.core.ParserFacade.prepBufReader(ParserFacade.java:298)
位于org.python.core.ParserFacade.prepBufReader(ParserFacade.java:288)
位于org.python.core.ParserFacade.parse(ParserFacade.java:183)
... 还有13个
可能是我使用的execfile
错误吗?
或者这是一个错误还是我在
InputStream
的工作方式中遗漏了什么?我在堆栈跟踪中看到,有一个对adjustForBOM
(BOM=)的引用
这可能意味着您的文件MyPlugin.py
以不同的编码存储,而其他文件则为您工作
是否可以尝试使用不同的编码(如UTF-8)重新保存文件?是否确定
EmbeddedJython.class.getResourceAsStream(“MyPlugin.py”)代码>正在查找资源吗
如果找不到资源,getResourceAsStream
将返回一个null
,Jython解释器可能会将其视为空(封闭)流
您的应用程序可能应该检查这一点,而不是假设getResourceAsStream
已经成功
如果我私有文件pythonFile=new文件('MyScirpt.py')然后手动getResourceAsStream(pythonFile.getAbsolutePath())代码>
那不行。getResourceAsStream
方法在类加载器的类路径上查找资源,并需要一个可以相对于类路径上的某个条目解析的路径
您可能想这样做:
private File pythonFile = new File('MyScirpt.py');
InputStream is = new FileInputStream(pythonFile);
并将is
传递给解释器。您还需要在解释器完成后安排流始终关闭。。。通过任何发生的机制。Hm.它存储在UTF-8中的unix行结尾中,java是否不能很好地使用这些设置?其他脚本是否使用相同的编码和BOM保存?其他脚本调用java内部的字符串(所有内容最终都在一个jar中结束)但是如果我创建一个像p这样的文件对象,就没有其他工作脚本了