【问题标题】:Importing a local python file in an embedded graalpython script fails在嵌入式 graalpython 脚本中导入本地 python 文件失败
【发布时间】:2022-06-24 17:43:34
【问题描述】:

是否可以在另一个使用 graalpython 从 Java 运行的脚本中导入本地 python 脚本?

在 Java (Scala) 方面,代码如下所示:

  val context =  Context.newBuilder("python").
    allowAllAccess(true).
    option("python.ForceImportSite", "true").
    option("python.Executable", "pyScripts/venv/bin/graalpython").
    build()
  val source = Source.newBuilder("python", new File("pyScripts/common/MyPyScript.py")).build()

  context.eval(source)
  val clazz = context.getPolyglotBindings.getMember("MyPyScript")
  val instance = clazz.newInstance()
  val res = instance.as(classOf[PyScriptApi])

然后在graalpython脚本中,我想做这样的事情(两个python文件都在common子目录下):

import java
import polyglot

from common.ScriptBase import ScriptBase

class MyPyScript(ScriptBase):
    ...

但是,这在 Scala 方面会出错:

Exception in thread "main" ModuleNotFoundError: No module named 'common'

我知道 Scala 代码可以评估此​​文件,但我希望脚本编写者能够将脚本拆分为多个文件。

【问题讨论】:

    标签: graalpython


    【解决方案1】:

    事实证明,如果您在 Java/Scala 代码的上下文中设置“python.PythonPath”选项,则本地导入工作:

      val context =  Context.newBuilder("python")
        .allowAllAccess(true)
        .option("python.PythonPath", "pyScripts")
        .option("python.ForceImportSite", "true")
        .option("python.Executable", "pyScripts/venv/bin/graalpython")
        .build()
    

    【讨论】:

      猜你喜欢
      • 2021-08-17
      • 1970-01-01
      • 1970-01-01
      • 2015-08-13
      • 1970-01-01
      • 2021-04-29
      • 1970-01-01
      • 1970-01-01
      • 2020-05-03
      相关资源
      最近更新 更多