2011-06-21 11 views
2

プラグイン内でJythonインタプリタを起動し、インタプリタ内でファイルを実行したかったのです。私は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.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"); 
    } 

} 

11:03:38 [SEVERE] Error occurred while enabling JythonTest v0.12 (Is it up to da 
te?): null 
java.io.IOException: Stream closed 
     at java.io.BufferedInputStream.getInIfOpen(Unknown Source) 
     at java.io.BufferedInputStream.fill(Unknown Source) 
     at java.io.BufferedInputStream.read(Unknown Source) 
     at org.python.core.ParserFacade.adjustForBOM(ParserFacade.java:371) 
     at org.python.core.ParserFacade.prepBufReader(ParserFacade.java:298) 
     at org.python.core.ParserFacade.prepBufReader(ParserFacade.java:288) 
     at org.python.core.ParserFacade.parse(ParserFacade.java:183) 
     at org.python.core.Py.compile_flags(Py.java:1717) 
     at org.python.util.PythonInterpreter.execfile(PythonInterpreter.java:235 
) 
     at com.jakob.jython.EmbeddedJython.onEnable(EmbeddedJython.java:26) 
     at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:125) 
     at org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader 
.java:750) 
     at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManage 
r.java:253) 
     at org.bukkit.craftbukkit.CraftServer.loadPlugin(CraftServer.java:132) 
     at org.bukkit.craftbukkit.CraftServer.loadPlugins(CraftServer.java:110) 
     at net.minecraft.server.MinecraftServer.e(MinecraftServer.java:218) 
     at net.minecraft.server.MinecraftServer.a(MinecraftServer.java:205) 
     at net.minecraft.server.MinecraftServer.init(MinecraftServer.java:145) 
     at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:265) 
     at net.minecraft.server.ThreadServerApplication.run(SourceFile:394) 

java.io.IOException: java.io.IOException: Stream closed 

     at org.python.core.PyException.fillInStackTrace(PyException.java:70) 
     at java.lang.Throwable.<init>(Throwable.java:181) 
     at java.lang.Exception.<init>(Unknown Source) 
     at java.lang.RuntimeException.<init>(Unknown Source) 
     at org.python.core.PyException.<init>(PyException.java:46) 
     at org.python.core.PyException.<init>(PyException.java:43) 
     at org.python.core.Py.JavaError(Py.java:481) 
     at org.python.core.ParserFacade.fixParseError(ParserFacade.java:104) 
     at org.python.core.ParserFacade.parse(ParserFacade.java:186) 
     at org.python.core.Py.compile_flags(Py.java:1717) 
     at org.python.util.PythonInterpreter.execfile(PythonInterpreter.java:235 
) 
     at com.jakob.jython.EmbeddedJython.onEnable(EmbeddedJython.java:26) 
     at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:125) 
     at org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader 
.java:750) 
     at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManage 
r.java:253) 
     at org.bukkit.craftbukkit.CraftServer.loadPlugin(CraftServer.java:132) 
     at org.bukkit.craftbukkit.CraftServer.loadPlugins(CraftServer.java:110) 
     at net.minecraft.server.MinecraftServer.e(MinecraftServer.java:218) 
     at net.minecraft.server.MinecraftServer.a(MinecraftServer.java:205) 
     at net.minecraft.server.MinecraftServer.init(MinecraftServer.java:145) 
     at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:265) 
     at net.minecraft.server.ThreadServerApplication.run(SourceFile:394) 
Caused by: java.io.IOException: Stream closed 
     at java.io.BufferedInputStream.getInIfOpen(Unknown Source) 
     at java.io.BufferedInputStream.fill(Unknown Source) 
     at java.io.BufferedInputStream.read(Unknown Source) 
     at org.python.core.ParserFacade.adjustForBOM(ParserFacade.java:371) 
     at org.python.core.ParserFacade.prepBufReader(ParserFacade.java:298) 
     at org.python.core.ParserFacade.prepBufReader(ParserFacade.java:288) 
     at org.python.core.ParserFacade.parse(ParserFacade.java:183) 
     ... 13 more 

でしたそれは私が間違ってexecfileを使用しているのですか? それはエラーや何かが私が行方不明になっている方法ですか?InputStream

答えて

2

EmbeddedJython.class.getResourceAsStream("MyPlugin.py");がリソースを検出していますか?

リソースが見つからない場合、getResourceAsStreamnullを返します.Jythonインタプリタはこれを空の(閉じた)ストリームとして扱う可能性があります。

getResourceAsStreamが成功したと仮定するのではなく、アプリケーションがこれをチェックする必要があります。


私はprivate File pythonFile = new File('MyScirpt.py');、その後は動作しませんgetResourceAsStream(pythonFile.getAbsolutePath());

を渡した場合。 getResourceAsStreamメソッドは、クラスローダのクラスパス上のリソースを探し、クラスパス上のいくつかのエントリに対して解決できるパスが必要です。

private File pythonFile = new File('MyScirpt.py'); 
InputStream is = new FileInputStream(pythonFile); 

をしてインタプリタにisを渡す:

は、おそらくこれをしたいです。また、何らかの仕組みがあれば、ストリームが常にで終了するように設定する必要があります。

+0

hmmもし私が 'private file pythonFile = new File( 'MyScirpt.py');のようなファイルオブジェクトを作成したら、' getResourceAsStream(pythonFile.getAbsolutePath()); ' –

0

スタックトレースには、(BOM = Byte Order Mark)への参照があります。

これは、ファイルMyPlugin.pyが、あなたのために働いている他のファイルとは異なるエンコーディングで格納されている可能性があります。

ファイルを別のエンコード、たとえばUTF-8で保存し直すことはできますか?

+0

Hm。 UTF-8でunixの行末に格納されていますが、javaはそれらの設定でうまく動かないのですか? –

+0

BOMを使用して、同じエンコーディングで保存された他のスクリプトは保存されていますか? –

+0

他のスクリプトはjava内の文字列を呼び出しますが(最終的にはすべてjarで終わります)、他の作業スクリプトはありません。 –

関連する問題