Java 尝试设置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

我想在插件中启动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.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这样的文件对象,就没有其他工作脚本了