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
我玩 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