GraalVM 中的 运行 Python - 不允许操作:在 org.graalvm.truffle/com.oracle.truffle.polyglot.FileSystems.forbidden(FileSystems.java:1345)

run Python in GraalVM - Operation is not allowed for: at org.graalvm.truffle/com.oracle.truffle.polyglot.FileSystems.forbidden(FileSystems.java:1345)

我玩 GraalVM,运行 Python 来自 Java

import org.graalvm.polyglot.*;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;

public class HelloPolyglot {
    public static void main(String[] args) {
        System.out.println("Hello Java!");
        try (Context context = Context.create()) {
            context.eval("python", "print('Hello Python!')");

            context.eval("python", "import sys; print(sys.version)");

            String pyFilename = "./health.py";
            // Java 11 API
            try {
                String s = Files.readString(Path.of(pyFilename));

                context.eval("python", s);
            } catch ( IOException e){
                log("IOException "+e);
            }
        }
    }

    public static void log(String s){
        System.out.println(s);
    }
}

我得到了这么长的输出

不过主要是这3行

Operation is not allowed for: 
Exception in thread "main" org.graalvm.polyglot.PolyglotException: java.lang.SecurityException: Operation is not allowed for: 
    at org.graalvm.truffle/com.oracle.truffle.polyglot.FileSystems.forbidden(FileSystems.java:1345)

是的,很明显 运行 Python 文件中的脚本是“禁止的”, 但是怎么办呢?

/Library/Java/JavaVirtualMachines/graalvm-ce-java11-21.1.0/Contents/Home/bin/java -javaagent:/Applications/IntelliJ IDEA CE.app/Contents/lib/idea_rt.jar=54943:/Applications/IntelliJ IDEA CE.app/Contents/bin -Dfile.encoding=UTF-8 -classpath /Users/paul.verest/Workspaces/Java/GraalVMProject2/target/classes HelloPolyglot
Hello Java!
Hello Python!
3.8.5 (Fri Jun 25 17:55:09 CST 2021)
[Graal, GraalVM CE, Java 11.0.11]
Traceback (most recent call last):
  "Unnamed", line 4, in <module 'Unnamed'>
  "/importlib/_bootstrap.py", line 1109, in __import__
  "/importlib/_bootstrap.py", line 1030, in _gcd_import
  "/importlib/_bootstrap.py", line 1007, in _find_and_load
  "/importlib/_bootstrap.py", line 971, in _find_and_load_unlocked
  "/importlib/_bootstrap.py", line 914, in _find_spec
  "/importlib/_bootstrap_external.py", line 1346, in find_spec
  "/importlib/_bootstrap_external.py", line 1315, in _get_spec
  "/importlib/_bootstrap_external.py", line 1279, in _path_importer_cache
Operation is not allowed for: 
Exception in thread "main" org.graalvm.polyglot.PolyglotException: java.lang.SecurityException: Operation is not allowed for: 
    at org.graalvm.truffle/com.oracle.truffle.polyglot.FileSystems.forbidden(FileSystems.java:1345)
    at org.graalvm.truffle/com.oracle.truffle.polyglot.FileSystems.access00(FileSystems.java:83)
    at org.graalvm.truffle/com.oracle.truffle.polyglot.FileSystems$DeniedIOFileSystem.toAbsolutePath(FileSystems.java:1039)
    at org.graalvm.truffle/com.oracle.truffle.api.TruffleFile.toAbsolutePathImpl(TruffleFile.java:2089)
    at org.graalvm.truffle/com.oracle.truffle.api.TruffleFile.getAbsoluteFile(TruffleFile.java:519)
    at org.graalvm.truffle/com.oracle.truffle.api.TruffleLanguage$Env.getCurrentWorkingDirectory(TruffleLanguage.java:3032)
    at com.oracle.graal.python.runtime.EmulatedPosixSupport.getcwd(EmulatedPosixSupport.java:1124)
    at com.oracle.graal.python.runtime.EmulatedPosixSupportGen$PosixSupportLibraryExports$Cached.getcwd(EmulatedPosixSupportGen.java:776)
    at com.oracle.graal.python.builtins.modules.PosixModuleBuiltins$GetcwdNode.getcwd(PosixModuleBuiltins.java:1177)
    at com.oracle.graal.python.builtins.modules.PosixModuleBuiltinsFactory$GetcwdNodeFactory$GetcwdNodeGen.executeAndSpecialize(PosixModuleBuiltinsFactory.java:3885)
    at com.oracle.graal.python.builtins.modules.PosixModuleBuiltinsFactory$GetcwdNodeFactory$GetcwdNodeGen.execute(PosixModuleBuiltinsFactory.java:3871)
    at com.oracle.graal.python.nodes.function.builtins.BuiltinCallNode$BuiltinAnyCallNode.execute(BuiltinCallNode.java:64)
    at com.oracle.graal.python.nodes.function.BuiltinFunctionRootNode.execute(BuiltinFunctionRootNode.java:302)
    at <python> <module 'Unnamed'>(Unnamed:4:111-118)
    at org.graalvm.sdk/org.graalvm.polyglot.Context.eval(Context.java:379)
    at HelloPolyglot.main(HelloPolyglot.java:21)
Original Internal Error: 
java.lang.SecurityException: Operation is not allowed for: 
    at org.graalvm.truffle/com.oracle.truffle.polyglot.FileSystems.forbidden(FileSystems.java:1345)
    at org.graalvm.truffle/com.oracle.truffle.polyglot.FileSystems.access00(FileSystems.java:83)
    at org.graalvm.truffle/com.oracle.truffle.polyglot.FileSystems$DeniedIOFileSystem.toAbsolutePath(FileSystems.java:1039)
 .........
    at com.oracle.graal.python.nodes.control.TopLevelExceptionHandler.run(TopLevelExceptionHandler.java:249)
    at com.oracle.graal.python.nodes.control.TopLevelExceptionHandler.execute(TopLevelExceptionHandler.java:133)
    at jdk.internal.vm.compiler/org.graalvm.compiler.truffle.runtime.OptimizedCallTarget.executeRootNode(OptimizedCallTarget.java:613)
    at jdk.internal.vm.compiler/org.graalvm.compiler.truffle.runtime.OptimizedCallTarget.profiledPERoot(OptimizedCallTarget.java:584)
    at jdk.internal.vm.compiler/org.graalvm.compiler.truffle.runtime.OptimizedCallTarget.callBoundary(OptimizedCallTarget.java:534)
    at jdk.internal.vm.compiler/org.graalvm.compiler.truffle.runtime.OptimizedCallTarget.doInvoke(OptimizedCallTarget.java:518)
    at jdk.internal.vm.compiler/org.graalvm.compiler.truffle.runtime.OptimizedCallTarget.callIndirect(OptimizedCallTarget.java:463)
    at jdk.internal.vm.compiler/org.graalvm.compiler.truffle.runtime.OptimizedCallTarget.call(OptimizedCallTarget.java:444)
    at org.graalvm.truffle/com.oracle.truffle.polyglot.PolyglotContextImpl.eval(PolyglotContextImpl.java:1050)
    at org.graalvm.sdk/org.graalvm.polyglot.Context.eval(Context.java:353)
    at org.graalvm.sdk/org.graalvm.polyglot.Context.eval(Context.java:379)
    at HelloPolyglot.main(HelloPolyglot.java:21)
Caused by: Attached Guest Language Frames (11)

Process finished with exit code 1

问题不在于 Java 代码,而在于 Python。

上述错误的确切行是

import requests

osGraalVM 无​​法解析非内置包。

这个 Java 片段可能有助于更好地解决问题:

            //4
            try(BufferedReader br = new BufferedReader(new FileReader(pyFilename))) {
                int i = 0;
                for(String line; (line = br.readLine()) != null; ) {
                    i++;
                    log(""+i+": "+line);
                    context.eval("python", line);
                }
            }catch ( IOException e){
                log("IOException "+e);
            }


    public static void log(String s){
        System.out.println(s);
    }

您需要为上下文授予 IO 权限。为了进行实验,您可以像这样授予它所有权限:

Context.newBuilder().allowAllAccess(true).build()

在生产中,您可能想要限制权限。

这可能是进一步实验的有用资源:https://medium.com/graalvm/supercharge-your-java-apps-with-python-ec5d30634d18