CPythonの代替としてGraalPyを使い始めるには、ここにアクセスしてください。
JVMでのGraalPyの開始
GraalPyは、GraalVM JDK、Oracle JDKまたはOpenJDKとともに使用できます。次に示すように、MavenまたはGradleビルド・ツールを使用して、GraalPyをJavaアプリケーションに簡単に追加できます。他のビルド・システム(Ant、Make、CMakeなど)も、多少の手動作業とともに使用できます。
Maven
GraalPyは、Mavenアーティファクトを使用して、PythonパッケージをJavaアプリケーションに埋め込むMavenプロジェクトを生成できます。
- バージョン24.0以降、GraalPyプロジェクトは、スタータ・プロジェクトを生成するためのMavenアーキタイプを公開しています:
mvn archetype:generate \ -DarchetypeGroupId=org.graalvm.python \ -DarchetypeArtifactId=graalpy-archetype-polyglot-app \ -DarchetypeVersion=24.0.0
- 自動的に追加されたGraalVMネイティブ・イメージ・プラグインを使用して、ネイティブ実行可能ファイルをビルドします:
mvn -Pnative package
- 完了したら、実行可能ファイルを実行します:
./target/polyglot_app
アプリケーションによって「hello java」がコンソールに出力されます。
このプロジェクトでは、Python仮想環境を管理し、Pythonパッケージの依存関係をMavenワークフローと統合するための追加機能を備えたGraalVM SDKポリグロットAPIを使用します。Javaコードとpom.xmlファイルについては詳細に説明されており、生成されたコードに使用可能な機能が記述されています。(Mavenを使用しない場合は、アーキタイプJavaコードにもカスタム埋込みを作成するためのガイダンスが表示されます。)
ネイティブ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
- 次のコマンドを使用し、プロンプトに従って(ビルド・スクリプト言語の選択、テスト・フレームワークの選択など) GradleでJavaアプリケーションを作成します:
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を開き、次のように変更します。
-
GraalPyサポートおよびGraalVM SDKポリグロットAPIを
dependencies
セクションに含めます:implementation("org.graalvm.polyglot:polyglot:23.1.2") implementation("org.graalvm.polyglot:python:23.1.2")
- Javaモジュール・ビルドを使用することをお薦めします。
plugins
セクションに適切なプラグインを追加します:id("org.javamodularity.moduleplugin") version "1.8.12"
- アプリケーションをクラスパスからではなくモジュールとして実行するには、
application
セクションを編集して次のようにします:application { mainClass.set("interop.App") mainModule.set("interop") }
-
- app/src/main/java/module-info.javaという名前の新しいファイルを次の内容で作成します:
module interop { requires org.graalvm.polyglot; }
- 最後に、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によって異なります。詳細は、ランタイム最適化のサポートに関する項を参照してください。
Maven依存関係を直接サポートしないAnt、CMake、Makefileまたはその他のビルド・システム
一部の(通常は古い)プロジェクトは、Maven依存関係を直接サポートしないAnt、Makefile、CMakeまたはその他のビルド・システムを使用している可能性があります。Apache Ivy™などのプロジェクトでは、このようなビルド・システムでMaven依存関係を解決できますが、開発者がそれらを使用しない理由が存在する可能性があります。GraalPyには、Mavenから必要なJARファイルを取得するためのツールが付属しています。
-
プロジェクト用のサード・パーティの依存関係が格納されるディレクトリがあり、そのクラスパスにJARファイルを配置するようにビルド・システムが設定されている場合、プロジェクト・ディレクトリ・ツリーは次のようになります:
├───lib │ └─── ... *.jar dependencies are here └───src └─── ... *.java files and resources are here
-
システムにGraalPyをインストールし、
PATH
にgraalpy
があることを確認します。コマンドライン・インタフェースを開き、プロジェクト・ディレクトリを入力します。次に、システムに応じて、次のいずれかのコマンドを実行します:POSIXシェルの場合:
export GRAALPY_HOME=$(graalpy -c 'print(__graalpython__.home)') "${GRAALPY_HOME}/libexec/graalpy-polyglot-get" -a python -o lib -v "24.0.0"
PowerShellの場合:
$GRAALPY_HOME = graalpy -c "print(__graalpython__.home)" & "$GRAALPY_HOME/libexec/graalpy-polyglot-get" -a python -o lib -v "24.0.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()); } } }