在 JVM 上开始使用 GraalPy

您可以将 GraalPy 与 GraalVM JDK、Oracle JDK 或 OpenJDK 一起使用。您可以使用 Maven 或 Gradle 构建工具轻松地将 GraalPy 添加到您的 Java 应用程序中,如下所示。其他构建系统(Ant、Make、CMake 等)也可以在进行更多手动操作的情况下使用。

Maven #

GraalPy 可以生成一个 Maven 项目,该项目使用 Maven 工件 将 Python 包嵌入到 Java 应用程序中。

  1. GraalPy 项目发布一个 Maven 原型,用于生成一个入门项目
    mvn archetype:generate \
      -DarchetypeGroupId=org.graalvm.python \
      -DarchetypeArtifactId=graalpy-archetype-polyglot-app \
      -DarchetypeVersion=24.1.0
    
  2. 使用 GraalVM 原生镜像“工具” 插件(该插件已为您自动添加)构建一个原生可执行文件
     mvn -Pnative package
    
  3. 完成后,运行可执行文件
     ./target/polyglot_app
    

    应用程序将“hello java”打印到控制台。

该项目使用 GraalVM 多语言 API,并提供其他功能来管理 Python 虚拟环境并将 Python 包依赖项与 Maven 工作流程集成。Java 代码和pom.xml文件都有大量文档,生成的代码描述了可用功能。

另请参阅 嵌入式构建工具,以了解更多关于 GraalPy Maven 插件的信息。

使用原生 Python 包创建跨平台 JAR #

生成的项目使用 GraalPy Maven 插件,这使得添加 Python 依赖项变得容易。但是,Python 包可能具有特定于构建系统的原生组件。为了将生成的应用程序分发到其他系统,请执行以下步骤

  1. 在每个部署平台上构建项目。重命名 JAR 文件,以便每个文件都有一个特定于平台的名称,并将它们移动到同一台机器上的临时目录中。

  2. 解压缩每个 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 日发布)中提供。

  1. 使用以下命令创建一个使用 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
    
  2. 打开您的项目配置文件app/build.gradle,并对其进行如下修改。
    • dependencies部分中包含 GraalPy 支持和 GraalVM 多语言 API
        implementation("org.graalvm.polyglot:polyglot:24.1.1")
        implementation("org.graalvm.polyglot:python:24.1.1")
      
  3. 最后,将名为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());
             }
         }
     }
    
  4. 使用 Gradle 运行应用程序
     ./gradlew run
    

    应用程序将“Hello Python!”打印到控制台。

    注意:GraalPy 运行时的性能取决于您嵌入它的 JDK。有关更多信息,请参阅 运行时优化支持

  5. 您也可以选择使用第三方 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 插件的信息。

Ant、CMake、Makefile 或其他不支持 Maven 依赖项的构建系统 #

一些(通常是旧的)项目可能使用 Ant、Makefiles、CMake 或其他不支持 Maven 依赖项的构建系统。诸如 Apache Ivy™ 之类的项目使这些构建系统能够解析 Maven 依赖项,但开发人员可能出于某些原因不使用它们。GraalPy 带有一个工具,可以从 Maven 中获取所需的 JAR 文件。

  1. 假设有一个目录用于存储项目的第三方依赖项,并且构建系统已设置为将所有 JAR 文件放置在该目录的类路径上,那么项目目录树可能类似于以下内容

     ├───lib
     │   └─── ... *.jar dependencies are here
     └───src
         └─── ... *.java files and resources are here
    
  2. 安装 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目录中。

  3. 如果您的构建系统已设置为从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 替换。

联系我们