Python как "основной" язык в graalvm - PullRequest
2 голосов
/ 01 июля 2019

Я пытаюсь получить доступ к объектам Java из кода Python, используя graalvm. Может кто-нибудь указать мне на пример кода? По сути, я хочу иметь возможность запускать graalpython --polyglot --jvm myscript.py, где myscript.py может создать экземпляр объекта Java

Я просмотрел документацию по graalvm, и единственный найденный пример создает экземпляры Java-массивов из кода Python (см. Ниже). Я также просмотрел примеры полиглотов в этой ссылке https://www.graalvm.org/docs/reference-manual/embed/#access-java-from-guest-languages, и это по существу запускает Java Polyglot API, который запускает код Python, который обращается к Java-объекту, но это не то, что я хочу.

Пример кода, приведенный ниже, взят из этой ссылки , в которой также упоминается "и доступ к другим классам, кроме массивов Java , требуется перекомпилировать изображение и предоставить файл конфигурации отражения", но Я не совсем понимаю, как я могу это сделать.

import java

array = java.type("int[]")(4)
array[2] = 42
print("Printing Java Array" , array[2])

Я попытался изменить приведенный выше код так:

import java
import polyglot

array = java.type("int[]")(4)
array[2] = 42
print("Printing Java Array" , array[2])
# Just to see if I can access Java , example copied from Javascript -> Java 
re = polyglot.eval(string="RegExp()", language="java") 

И я получил следующее о / п:

Printing Java Array 42
Traceback (most recent call last):
File "polyglot.py", line 8, in <module 'polyglot.py'>
re = polyglot.eval(string="RegExp()", language="java")
NotImplementedError: No language for id java found. Supported   languages are: [internal/nfi-native, nfi, regex, js, llvm, python, ruby]

1 Ответ

3 голосов
/ 02 июля 2019

Вы не можете оценить код Java из строки - язык Java особенный, поскольку он является языком хоста, - вы можете получить доступ только к тому, что доступно (как байт-код) в пути к классам.Чтобы получить доступ к Java, вы должны написать для этого код Python, а не код Java, например:

import java
regexpClass = java.type("sun.misc.Regexp")
javaRegexp = regexpClass("hello")

Объекты ведут себя разумно из-за Python, т. Е. Создание экземпляров аналогично вызову, dir(javaRegexp)предоставить вам доступные методы Java и т. д.

...