- 面向 JDK 23 的 GraalVM(最新)
- 面向 JDK 24 的 GraalVM(抢先体验)
- 面向 JDK 21 的 GraalVM
- 面向 JDK 17 的 GraalVM
- 存档
- 开发版本
在 JVM 上开始使用 GraalPy
您可以将 GraalPy 与 GraalVM JDK、Oracle JDK 或 OpenJDK 一起使用。您可以使用 Maven 或 Gradle 构建工具轻松地将 GraalPy 添加到您的 Java 应用程序中,如下所示。其他构建系统(Ant、Make、CMake 等)也可以在进行更多手动操作的情况下使用。
Maven #
GraalPy 可以生成一个 Maven 项目,该项目使用 Maven 工件 将 Python 包嵌入到 Java 应用程序中。
- GraalPy 项目发布一个 Maven 原型,用于生成一个入门项目
mvn archetype:generate \ -DarchetypeGroupId=org.graalvm.python \ -DarchetypeArtifactId=graalpy-archetype-polyglot-app \ -DarchetypeVersion=24.1.0
- 使用 GraalVM 原生镜像“工具” 插件(该插件已为您自动添加)构建一个原生可执行文件
mvn -Pnative package
- 完成后,运行可执行文件
./target/polyglot_app
应用程序将“hello java”打印到控制台。
该项目使用 GraalVM 多语言 API,并提供其他功能来管理 Python 虚拟环境并将 Python 包依赖项与 Maven 工作流程集成。Java 代码和pom.xml文件都有大量文档,生成的代码描述了可用功能。
另请参阅 嵌入式构建工具,以了解更多关于 GraalPy Maven 插件的信息。
使用原生 Python 包创建跨平台 JAR #
生成的项目使用 GraalPy Maven 插件,这使得添加 Python 依赖项变得容易。但是,Python 包可能具有特定于构建系统的原生组件。为了将生成的应用程序分发到其他系统,请执行以下步骤
-
在每个部署平台上构建项目。重命名 JAR 文件,以便每个文件都有一个特定于平台的名称,并将它们移动到同一台机器上的临时目录中。
-
解压缩每个 JAR 文件(用正确的名称替换 JAR 文件)。一个名为vfs/fileslist.txt的特殊文件需要从每个 JAR 文件中连接起来。最后,从所有文件的组合以及连接后的fileslist.txt创建一个新的combined.jar。
unzip linux.jar -d combined mv combined/vfs/fileslist.txt fileslist-linux.txt unzip windows.jar -d combined mv combined/vfs/fileslist.txt fileslist-windows.txt cat fileslist-linux.txt fileslist-windows.txt > combined/vfs/fileslist.txt cd combined zip -r ../combined.jar *
Gradle #
注意:GraalPy Gradle 插件将在 GraalPy 版本 24.1.1(计划于 2024 年 10 月 15 日发布)中提供。
- 使用以下命令创建一个使用 Gradle 的 Java 应用程序,并按照提示操作(选择 Groovy 构建脚本语言,选择测试框架等)
gradle init --type java-application \ --project-name interop \ --package interop \ --no-split-project
该项目在当前工作目录中生成,具有以下结构
└── app ├── build.gradle └── src └── main ├── java │ └── interop │ └── App.java └── resources
- 打开您的项目配置文件app/build.gradle,并对其进行如下修改。
- 在
dependencies
部分中包含 GraalPy 支持和 GraalVM 多语言 APIimplementation("org.graalvm.polyglot:polyglot:24.1.1") implementation("org.graalvm.polyglot:python:24.1.1")
- 在
- 最后,将名为App.java的文件中的代码替换为以下内容,以进行一个小型 Python 嵌入
package interop; import org.graalvm.polyglot.*; class App { public static void main(String[] args) { try (var context = Context.create()) { System.out.println(context.eval("python", "'Hello Python!'").asString()); } } }
- 使用 Gradle 运行应用程序
./gradlew run
应用程序将“Hello Python!”打印到控制台。
注意:GraalPy 运行时的性能取决于您嵌入它的 JDK。有关更多信息,请参阅 运行时优化支持。
-
您也可以选择使用第三方 Python 包
5.1. 在app/build.gradle中
- 将 graalpy-gradle-plugin 添加到
plugins
部分id "org.graalvm.python" version "24.1.1"
- 配置 GraalPy Gradle 插件
graalPy { packages = ["termcolor==2.2"] }
5.2. 在settings.gradle中,添加以下
pluginManagement
配置。pluginManagement { repositories { gradlePluginPortal() } }
5.3. 更新名为App.java的文件,如下所示
package interop; import org.graalvm.polyglot.*; import org.graalvm.python.embedding.utils.GraalPyResources; class App { ... public static void main(String[] args) { try (Context context = GraalPyResources.createContext()) { String src = """ from termcolor import colored colored_text = colored("hello java", "red", attrs=["reverse", "blink"]) print(colored_text) """; context.eval("python", src); } }
- 将 graalpy-gradle-plugin 添加到
另请参阅 嵌入式构建工具,以了解更多关于 GraalPy Gradle 插件的信息。
Ant、CMake、Makefile 或其他不支持 Maven 依赖项的构建系统 #
一些(通常是旧的)项目可能使用 Ant、Makefiles、CMake 或其他不支持 Maven 依赖项的构建系统。诸如 Apache Ivy™ 之类的项目使这些构建系统能够解析 Maven 依赖项,但开发人员可能出于某些原因不使用它们。GraalPy 带有一个工具,可以从 Maven 中获取所需的 JAR 文件。
-
假设有一个目录用于存储项目的第三方依赖项,并且构建系统已设置为将所有 JAR 文件放置在该目录的类路径上,那么项目目录树可能类似于以下内容
├───lib │ └─── ... *.jar dependencies are here └───src └─── ... *.java files and resources are here
-
安装 GraalPy 以用于您的系统,并确保您的
PATH
中包含graalpy
。打开一个命令行界面并进入您的项目目录。然后,根据您的系统,运行以下命令之一在 POSIX shell 中
export GRAALPY_HOME=$(graalpy -c 'print(__graalpython__.home)') "${GRAALPY_HOME}/libexec/graalpy-polyglot-get" -a python -o lib -v "24.1.0"
在 PowerShell 中
$GRAALPY_HOME = graalpy -c "print(__graalpython__.home)" & "$GRAALPY_HOME/libexec/graalpy-polyglot-get" -a python -o lib -v "24.1.0"
这些命令将所有 GraalPy 依赖项下载到lib目录中。
-
如果您的构建系统已设置为从lib中提取 JAR 文件,那么如果将以下 GraalPy 嵌入代码放在项目中适当的位置(以便作为主类运行),则该代码应该可以正常工作。
import org.graalvm.polyglot.*; public class Hello { public static void main(String[] args) { try (var context = Context.newBuilder().option("engine.WarnInterpreterOnly", "false").build()) { System.out.println(context.eval("python", "'Hello Python!'").asString()); } } }
将 GraalPy 作为 CPython 替换 #
请访问 这里,以开始使用 GraalPy 作为 CPython 替换。