graalvm 来宾语言可以使用第 3 方库吗?

问题描述

我正在编写一些在 graalvm 上运行的 Java 代码
我希望它执行一个 python 脚本
python 脚本使用 3rd 方库
当我运行我的 java 代码时,它会出现 ModuleNotFoundError 异常

// java code
public static void main(String[] args) throws IOException {
    try(Context ctx = Context.newBuilder().allowAllAccess(true).build()){
        Path scriptPath = Paths.get("/home/hyc/Desktop/py_script.py");
        String script = Files.readString(scriptPath);
        Value value = ctx.eval("python",script);
    }
}

// py_script.py
import requests                                                                                                        
url = 'http://www.google.com/'
strhtml = requests.get(url)        
print(strhtml.text)

代码链接https://github.com/huangdaren1997/polyglotDemo

graalvm 来宾语言是否可以使用 3rd 方库?以及怎么做?

操作系统:manjaro 20.2 Nibia
内核:x86_64 Linux 5.9.11-3-manjaro
Python:Python 3.8.6
openjdk 11 64 位服务器 VM GraalVM CE 20.3.0

解决方法

首先你需要安装这个包,我假设你已经完成了,但只是为了让这个答案完整:

graalpython -m ginstall install requests

然后需要配置 GraalPython 来导入 the site module。如果您通过可执行文件运行 GraalPython,则默认情况下会执行此操作,但在将 GraalPython 嵌入 Java 时则不会:

Context.newBuilder().option("python.ForceImportSite","true")...

请注意,此设置将取决于站点库中安装的所需软件包。更简洁的解决方案可能是使用 GraalPython 也支持的 venv module

graalpython -m venv /path/to/you/new/venv/directory

然后安装你需要的

/path/to/you/new/venv/directory/bin/graalpython -m ginstall install ...

然后另外将此选项传递给 GraalPython:

.option("python.SysPrefix","/path/to/you/new/venv/directory")