2017-12-02 5 views
0

私はJythonインタプリタをScalaプログラムに埋め込みたいと思っています。しかし、私はスクリプトエンジンを手に入れようとしていません。Jythonをスカラプログラムに埋め込む

私はSBT v0.13.15を使用しています。ここに私のbuild.sbtファイルがあります:

name := "jython" 

version := "0.1" 

scalaVersion := "2.11.11" 

libraryDependencies ++= Seq(
    "org.python" % "jython" % "2.7.0", 
    "org.scala-lang" % "scala-compiler" % scalaVersion.value 
) 

マイScalaのコードが

package forms 

import javax.script._ 

object Main { 
    def main(args: Array[String]): Unit = { 
    val engineManager = new ScriptEngineManager() 
    for (i ← 0 until engineManager.getEngineFactories.size()) { 
     val e = engineManager.getEngineFactories.get(i) 
     println(s"factory name: ${e.getEngineName}, ${e.getLanguageName}, ${e.getNames}") 
    } 

    val engine = engineManager.getEngineByName("python") 
    require(engine != null, "Script engine is null.") 
    } 
} 

この出力

factory name: Scala Interpreter, Scala, [scala] 
factory name: Oracle Nashorn, ECMAScript, [nashorn, Nashorn, js, JS, JavaScript, javascript, ECMAScript, ecmascript] 
factory name: jython, python, [python, jython] 
Exception in thread "main" java.lang.IllegalArgumentException: requirement failed: Script engine is null. 

あるので、エンジンマネージャは、Pythonの工場について知っていることが表示されますが、することができませんそれを取得するか、インスタンス化します。私は同様の結果を持つ "python"と "jython"という名前でアクセスしようとしました。

私が読んだScriptEngineManagerにnullを渡すと役立ちますが、私にとってそれは一歩後退だったhere。それはナショーン工場だけを見つけました。

私も直接Pythonの工場をインスタンス化しようとしました:

val engine = (new PyScriptEngineFactory).getScriptEngine 

しかし、これは進行中のように見えるエラーが行われているが、私は解決する方法がわからない生成:

Exception in thread "main" ImportError: Cannot import site module and its dependencies: No module named site 
Determine if the following attributes are correct: 
    * sys.path: ['/Users/bwbecker/.ivy2/cache/org.python/jython/jars/Lib', '__classpath__', '__pyclasspath__/'] 
    This attribute might be including the wrong directories, such as from CPython 
    * sys.prefix: /Users/bwbecker/.ivy2/cache/org.python/jython/jars 
    This attribute is set by the system property python.home, although it can 
    be often automatically determined by the location of the Jython jar file 

私は、2つのアプローチが同じ基本的な問題を抱えていると推測します。最初の方法は単に初期化エラーをキャッチし、nullを返します。

どのように進むかについてのご意見は、大歓迎です。

答えて

0

あなたがエンジンを取得するために、呼び出しの前に、次のコードを配置することで、サイトのモジュールをインポートしようとする(いずれかEngineManagerを使用して、または直接PyScriptEngineFactory付き)を抑制することができます

import org.python.core.Py 
import org.python.core.PySystemState 

val props = new Properties() 
props.setProperty("python.import.site", "false") 
PySystemState.initialize(props, new Properties()) 
val engineSys = new PySystemState 
Py.setSystemState(engineSys) 
関連する問題