私は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を返します。
どのように進むかについてのご意見は、大歓迎です。