{"id":25238014,"url":"https://github.com/vspaz/graalvm-java-python-interoperation","last_synced_at":"2026-04-13T20:02:32.070Z","repository":{"id":152011561,"uuid":"433887026","full_name":"vspaz/graalvm-java-python-interoperation","owner":"vspaz","description":"java \u003c-\u003e python inter-operation examples with GraalVM","archived":false,"fork":false,"pushed_at":"2023-09-18T18:13:55.000Z","size":28,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-05T18:52:21.276Z","etag":null,"topics":["graalpython","graalvm","java","numpy","pandas","python"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/vspaz.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-12-01T15:43:55.000Z","updated_at":"2024-09-24T14:13:05.000Z","dependencies_parsed_at":null,"dependency_job_id":"b49e1002-44cb-498e-8c07-e4b0e54d88ed","html_url":"https://github.com/vspaz/graalvm-java-python-interoperation","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/vspaz/graalvm-java-python-interoperation","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vspaz%2Fgraalvm-java-python-interoperation","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vspaz%2Fgraalvm-java-python-interoperation/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vspaz%2Fgraalvm-java-python-interoperation/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vspaz%2Fgraalvm-java-python-interoperation/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/vspaz","download_url":"https://codeload.github.com/vspaz/graalvm-java-python-interoperation/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vspaz%2Fgraalvm-java-python-interoperation/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31768649,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-13T15:25:13.801Z","status":"ssl_error","status_checked_at":"2026-04-13T15:25:09.162Z","response_time":93,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["graalpython","graalvm","java","numpy","pandas","python"],"created_at":"2025-02-11T16:03:42.745Z","updated_at":"2026-04-13T20:02:32.063Z","avatar_url":"https://github.com/vspaz.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# GraalVM Java Python interoperation\n\n## Installation\n\n### Installing GraalVM\n\n1. Download the latest version GraalVM Community from https://github.com/graalvm/graalvm-ce-builds/releases/\n   currently it's 21.3.0.\n2. Extract the archive\n\n```shell\ntar -xvzf Downloads/graalvm-community-jdk-17.0.8_linux-x64_bin.tar.gz\nsudo mv graalvm-community-openjdk-17.0.8+7.1/ /usr/lib/jvm\n```\n\n## Configuration\n\n1. run ``update-alternatives --config java``\n\n```shell\nupdate-alternatives --config java\n\n# you should see something like this\n  Selection    Path                                            Priority   Status\n------------------------------------------------------------\n  0            /usr/lib/jvm/java-11-openjdk-amd64/bin/java      1111      auto mode\n* 1            /usr/lib/jvm/java-11-openjdk-amd64/bin/java      2         manual mode\n  2            /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java   1081      manual mode\n\nPress \u003center\u003e to keep the current choice[*], or type selection number: \n\n```\n\n2. Add a new Java configuration\n\n```shell\nsudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/graalvm-community-openjdk-17.0.8+7.1/bin/java 1111\n```\n\nnow you should see a new Java configuration\n\n```shell\nsudo update-alternatives --config java\nThere are 5 choices for the alternative java (providing /usr/bin/java).\n\n  Selection    Path                                                        Priority   Status\n------------------------------------------------------------\n  0            /usr/lib/jvm/java-19-openjdk-amd64/bin/java                  1911      auto mode\n* 1            /usr/lib/jvm/graalvm-community-openjdk-17.0.8+7.1/bin/java   1111      manual mode\n  2            /usr/lib/jvm/java-11-openjdk-amd64/bin/java                  1111      manual mode\n  3            /usr/lib/jvm/java-17-openjdk-amd64/bin/java                  1711      manual mode\n  4            /usr/lib/jvm/java-19-openjdk-amd64/bin/java                  1911      manual mode\n  5            /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java               1081      manual mode\n\nPress \u003center\u003e to keep the current choice[*], or type selection number:\n\n```\n\n3. Quick test: run ``java --version``\n\n```shell\nopenjdk 17.0.8 2023-07-18\nOpenJDK Runtime Environment GraalVM CE 17.0.8+7.1 (build 17.0.8+7-jvmci-23.0-b15)\nOpenJDK 64-Bit Server VM GraalVM CE 17.0.8+7.1 (build 17.0.8+7-jvmci-23.0-b15, mixed mode, sharing)\n```\n\n4. Add a new javac version\n\n```shell\nsudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/graalvm-community-openjdk-17.0.8+7.1/bin/javac 1111\n\nsudo update-alternatives --config javac\nThere are 5 choices for the alternative javac (providing /usr/bin/javac).\n\n  Selection    Path                                                         Priority   Status\n------------------------------------------------------------\n  0            /usr/lib/jvm/java-19-openjdk-amd64/bin/javac                  1911      auto mode\n* 1            /usr/lib/jvm/graalvm-community-openjdk-17.0.8+7.1/bin/javac   1111      manual mode\n  2            /usr/lib/jvm/java-11-openjdk-amd64/bin/javac                  1111      manual mode\n  3            /usr/lib/jvm/java-17-openjdk-amd64/bin/javac                  1711      manual mode\n  4            /usr/lib/jvm/java-19-openjdk-amd64/bin/javac                  1911      manual mode\n  5            /usr/lib/jvm/java-8-openjdk-amd64/bin/javac                   1081      manual mode\n\nPress \u003center\u003e to keep the current choice[*], or type selection number: \n```\n\n5Update .bashrc profile\n\n```shell\n# open .bashrc file with an editor of your choice, e.g. VIM.\nsudo vim ~/.bashrc\n\n# add the following line at the bottom of the file\nexport PATH=$PATH:/usr/lib/jvm/graalvm-community-openjdk-17.0.8+7.1/lib/installer/bin\n```\n\n### Installing Python support\n\nrun ``gu available``\n\n```shell\nDownloading: Component catalog from www.graalvm.org\nComponentId              Version             Component name                Stability                     Origin \n---------------------------------------------------------------------------------------------------------------------------------\nespresso                 23.0.1              Java on Truffle               Supported                     github.com\nespresso-llvm            23.0.1              Java on Truffle LLVM Java librSupported                     github.com\nicu4j                    23.0.1              ICU4J                         Supported                     github.com\njs                       23.0.1              Graal.js                      Supported                     github.com\nllvm                     23.0.1              LLVM Runtime Core             Supported                     github.com\nllvm-toolchain           23.0.1              LLVM.org toolchain            Supported                     github.com\nnative-image-llvm-backend23.0.1              Native Image LLVM Backend     Early adopter (experimental)  github.com\nnodejs                   23.0.1              Graal.nodejs                  Supported                     github.com\npython                   23.0.1              GraalVM Python                Experimental                  github.com\nregex                    23.0.1              TRegex                        Supported                     github.com\nruby                     23.0.1              TruffleRuby                   Experimental                  github.com\nvisualvm                 23.0.1              VisualVM                      Supported                     github.com\nwasm                     23.0.1              GraalWasm                     Experimental                  github.com\n\n```\n\nrun the following:\n\n1. ``gu install llvm-toolchain``\n2. ``gu install  native-image``\n3. ``gu install python``\n\n### Setting up python env\n\n```shell\nln -s /usr/lib/jvm/graalvm-community-openjdk-17.0.8+7.1/languages/python/bin/graalpy graalpython\n```\n\n```shell\n./graalpython -m venv graalenv\nsource graalenv/bin/activate\n```\n\n2. Installing packages you should be able to install most of common packages found on pypi with ``pip``, however; there\n   are some packages that might not be compatible. Some of these packages can be patched and made available.\n   run ``graalpython -m ginstall install --help``\n   to see such packages and install them via ``graalpython`` if they can't be installed directly via pip. Please, also\n   see item **4** in the **Possible Gotchas** section down below if you encounter some issues.\n\n```shell\ngraalpython -m ginstall install pandas\n```\n\n\n## Calling Python from Java\n\nSuppose you have a Python module at /path/to/file/your_module.py that does some computation with numpy e.g.\n\n```python\n#  your_module.py\n\nimport site  # required!\nimport numpy as np\nimport pandas as pd\n\n\ndef compute_total_with_numpy(*nums):\n    return float(np.array(nums).sum())\n\ndef compute_total_with_pandas(*nums):\n    return float(pd.DataFrame(nums).sum())\n\ndef compute_total_with_pure_python(*nums):\n    return sum(nums)\n\n```\n\nthen to use it from within Java you can do something as follows:\n\n```java\n// GraalPython.java\n\npackage org.vspaz.bindings;\n\nimport org.graalvm.polyglot.Context;\nimport org.graalvm.polyglot.Source;\nimport org.graalvm.polyglot.Value;\n\nimport java.io.File;\nimport java.io.IOException;\n\npublic class GraalPython {\n    private final Context ctx;\n\n    public GraalPython(String pythonModulePath) {\n        ctx = Context.newBuilder().allowAllAccess(true).build();\n        try {\n            ctx.eval(Source.newBuilder(\"python\", new File(pythonModulePath)).build());\n        } catch (IOException e) {\n            e.printStackTrace();\n        }\n    }\n\n    public Value runPythonMethod(String pythonFunction, Object[] args) {\n        return ctx.getBindings(\"python\").getMember(pythonFunction).execute(args);\n    }\n}\n\n// Main.java\n\nimport org.vspaz.bindings.GraalPython;\n\npublic class Main {\n    public static void main(String[] args) {\n        GraalPython bindings = new GraalPython(\"/path/to/your_module.py\");\n        Object[] nums = {1.0, 2.23, 3.49494, 4.40404, 5.10110, 181.101, 133.11};\n        assert bindings.runPythonMethod(\"compute_total_with_pandas\", nums).asDouble() == 330.44108;\n        assert bindings.runPythonMethod(\"compute_total_with_numpy\", nums).asDouble() == 330.44108;\n        assert bindings.runPythonMethod(\"compute_total_with_pure_python\", nums).asDouble() == 330.44108;\n    }\n}\n```\n\n## Calling Java from Python\n\nSuppose you have a Java class e.g.\n\n```java\n// StringOps.java\n\npublic class StringOps{\n   public String multiply(String text, int times) {\n      return String.valueOf(text).repeat(Math.max(0, times));\n   }\n}\n\n```\nthen compile it\n```shell\njavac StringOps.java\n```\n\n```python\n#  java_from_python.py\n\nimport java\n\n\nstring_ops = java.type(\"StringOps\")()\nassert \"abcabcabcabcabc\" == string_ops.multiply(\"abc\", 5)\n\n```\n\n```shell\ngraalpython --jvm --vm.cp=. java_from_python.py\n\n# or if you set up a graalpython venv, then e.g.\nsource graalenv/bin/activate\npython --jvm --vm.cp=. java_from_python.py\n```\n\n## Possible Gotchas\n\n1. **error**\n\n   Downloading: Component catalog from www.graalvm.org\n\n   Error: Unknown component\n\n   **solution**: you might be running an old version of GraalVM; check the version.\n2. **error**:\n\n   gu: command not found\n\n   **solution**: check if you can run ``gu`` by specifying the full path\n   e.g. ``./usr/lib/jvm/graalvm-community-openjdk-17.0.8+7.1/lib/installer/bin/gu``. if it works, then check the path in _.bashrc_\n3. **error**:\n\n   graalpython: command not found see item **2**.\n4. **error**: pip can't install any package e.g. requests\n\n   **solution**: pip install distutils\n\n5. **error**:\n   scipy can't be installed\n\n   **solution**: make sure you have the following gfortran libopenblas-dev liblapack-dev installed,\n   run ``sudo apt-get install gfortran libopenblas-dev liblapack-dev``\n\n## References\n\n1. https://www.graalvm.org/python/quickstart/\n2. https://www.graalvm.org/python/\n3. https://www.graalvm.org/reference-manual/python/","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvspaz%2Fgraalvm-java-python-interoperation","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fvspaz%2Fgraalvm-java-python-interoperation","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvspaz%2Fgraalvm-java-python-interoperation/lists"}