PemJa
What is it?
PemJa is an open source cross language call framework based on FFI. It aims to provide a high-performance
framework of calling between different languages.
Where to get it
Python binary installers for the latest released version are available at the Python package index
pip install pemja
Java Maven Dependency
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>pemja</artifactId>
<version>{version}</version>
</dependency>
Installation from sources
Prerequisites for building PemJa:
- Unix-like environment (we use Linux, Mac OS X), Windows
- Git
- Maven (we recommend version 3.2.5 and require at least 3.1.1)
- Java 8 or 11 (Java 9 or 10 may work) with $JAVA_HOME set correctly
- Python >= 3.8 (we recommend version 3.8, 3.9, 3.10, 3.11, 3.12, 3.13)
NOTE for windows:
- Microsoft Visual C++ 14.0 or greater is required. Get it with "Microsoft C++ Build Tools"
- The compressed package in folder dist must be uncompressed and use the following command to install
pip install dist/$packageName$
git clone https://github.com/alibaba/pemja.git
cd pemja
mvn clean install -DskipTests
pip install -r dev/dev-requirements.txt
python setup.py sdist
pip install dist/*.tar.gz
Usage
String path = ...;
PythonInterpreterConfig config = PythonInterpreterConfig
.newBuilder()
.setPythonExec("python3") // specify python exec, use "python" on Windows
.addPythonPaths(path) // add path to search path
.build();
PythonInterpreter interpreter = new PythonInterpreter(config);
// set & get
interpreter.set("a", 12345);
interpreter.get("a"); // Object
interpreter.get("a", Integer.class); // Integer
// exec & eval
interpreter.exec("print(a)");
// invoke functions
interpreter.exec("import str_upper");
String result = interpreter.invoke("str_upper.upper", "abcd");
// Object invoke(String name, Object... args);
// Object invoke(String name, Object[] args, Map<String, Object> kwargs);
// invoke object methods
/*
// invoke.py
class A:
def __init__(self):
self._a = 0
def get_value(self):
return self._a
def add(self, n):
self._a += n
def add_all(self, *args):
for item in args:
self._a += item
return self._a
def minus(self, n):
self._a -= n
return self._a
*/
interpreter.exec("import invoke");
interpreter.exec("a = invoke.A()");
interpreter.invokeMethod("a", "add", 3);
interpreter.invokeMethod("a", "minus", 2);
interpreter.invokeMethod("a", "add_all", 1, 2, 3);
// python callback java methods
/*
// invoke_callback.py
from pemja import findClass
StringBuilder = findClass('java.lang.StringBuilder')
Integer = findClass('java.lang.Integer')
def callback_java():
sb = StringBuilder()
sb.append('pemja')
sb.append('java')
sb.append('python')
sb.append(Integer.toHexString(Integer.MAX_VALUE))
return sb.toString()
*/
interpreter.exec("import call_back")
print(interpreter.invoke("call_back.callback_java"))
Documentation
How To Contribute
Metadata
Release files for pemja 0.6.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| pemja-0.6.2.tar.gz | 57.0 kB | Details |
Built distributions (wheels)
Total release size: 3.2 MB
Release files / pemja-0.6.2.tar.gz
| Download URL | pemja-0.6.2.tar.gz |
|---|---|
| Size | 57.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
6b51fb600d56708203874638c8fd7c473da41b8faba515831724da6563f5acca
|
|
BLAKE2b-256 checksum How to use checksums |
90126f6ca3f459fe79c778bf57bad4c03e246cd4812e3cf03e1833b2e5451924
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.11.13
|
Release files / pemja-0.6.2-cp314-cp314t-manylinux1_x86_64.whl
| Download URL | pemja-0.6.2-cp314-cp314t-manylinux1_x86_64.whl |
|---|---|
| Size | 69.1 kB |
| Tags | CPython 3.14 CPython 3.14 free-threading Linux glibc 2.5+ x86-64 |
|
SHA-256 checksum How to use checksums |
76369feea6c860709f53623c3327e5c5c5267918ddc607512491474c206d3a6d
|
|
BLAKE2b-256 checksum How to use checksums |
d1dcd47cfeceba1ce811a72779c67d94ebdfea775a46862c220bf7dcc75a244e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.11.13
|
Release files / pemja-0.6.2-cp313-cp313t-macosx_11_0_arm64.whl
| Download URL | pemja-0.6.2-cp313-cp313t-macosx_11_0_arm64.whl |
|---|---|
| Size | 57.8 kB |
| Tags | CPython 3.13 CPython 3.13 free-threading macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
60f7b6e5c0b3565383ddf1b024b444cd9a6971bc7b6f65389931ce45e6b23f73
|
|
BLAKE2b-256 checksum How to use checksums |
69cd7e85e9e58f58766b4873bed1bccf6c08785ca08989b3e4c6d867136ea434
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.11.13
|
Release files / pemja-0.6.2-cp313-cp313t-macosx_10_13_x86_64.whl
| Download URL | pemja-0.6.2-cp313-cp313t-macosx_10_13_x86_64.whl |
|---|---|
| Size | 56.5 kB |
| Tags | CPython 3.13 CPython 3.13 free-threading macOS 10.13+ x86-64 |
|
SHA-256 checksum How to use checksums |
8f063baad84e1102367bf764bce82c34ac41128384dba0cddba8f13c35a20295
|
|
BLAKE2b-256 checksum How to use checksums |
4713e3381e5e711a733c2a9407ad2cc7324f0ffccb2195f5ae07738e99146f05
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.11.13
|
Release files / pemja-0.6.2-cp313-cp313-manylinux1_x86_64.whl
| Download URL | pemja-0.6.2-cp313-cp313-manylinux1_x86_64.whl |
|---|---|
| Size | 68.9 kB |
| Tags | CPython 3.13 Linux glibc 2.5+ x86-64 |
|
SHA-256 checksum How to use checksums |
88b9fbf48bf8738f027b9f34164ebf158c3b64d573630323aec5ff35288b7a77
|
|
BLAKE2b-256 checksum How to use checksums |
4a4407abe8dfbc56c088ee2c16d2ad0579a8d00e853627b00d6349a9e76def1e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.11.13
|
Release files / pemja-0.6.2-cp313-cp313-macosx_11_0_arm64.whl
| Download URL | pemja-0.6.2-cp313-cp313-macosx_11_0_arm64.whl |
|---|---|
| Size | 56.3 kB |
| Tags | CPython 3.13 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
86abccf20be5e5aa4ee1b3a7344125271ac73e14cc6bc51bd085644775e61947
|
|
BLAKE2b-256 checksum How to use checksums |
49f1d93e99430149e28d52fff1f51f30920dd158dde5dda39368e68e91dcc7fb
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.11.13
|
Release files / pemja-0.6.2-cp313-cp313-macosx_10_13_x86_64.whl
| Download URL | pemja-0.6.2-cp313-cp313-macosx_10_13_x86_64.whl |
|---|---|
| Size | 55.1 kB |
| Tags | CPython 3.13 macOS 10.13+ x86-64 |
|
SHA-256 checksum How to use checksums |
0f79c5b5bd638b8a763dcb8aea7153df38f8244093bfd97db558f6c6acce0d2d
|
|
BLAKE2b-256 checksum How to use checksums |
118ad8fe08e65dcd30372be23e7ce3601d5900e8ee61ebbe1e13958ccabceaa5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.11.13
|
Release files / pemja-0.6.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
| Download URL | pemja-0.6.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl |
|---|---|
| Size | 330.7 kB |
| Tags | CPython 3.12 Linux glibc 2.17+ ARM64 |
|
SHA-256 checksum How to use checksums |
74033438aa2ecb114f702161dd75a033263a4e8f8d5033754ccec6aa935afc8f
|
|
BLAKE2b-256 checksum How to use checksums |
f7e95dbc41980025487a73213bd1a5213b0cc143bc9c109c1409cfec6f6b297c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.11.13
|
Release files / pemja-0.6.2-cp312-cp312-manylinux1_x86_64.whl
| Download URL | pemja-0.6.2-cp312-cp312-manylinux1_x86_64.whl |
|---|---|
| Size | 68.9 kB |
| Tags | CPython 3.12 Linux glibc 2.5+ x86-64 |
|
SHA-256 checksum How to use checksums |
90977b952e7ad0d58630bb0841f77a835f508bb54b75ebd02553b6cf8ff2257c
|
|
BLAKE2b-256 checksum How to use checksums |
e62e43463baeacd0d7a7b90b739d94df1b69c2eb04e4cfa3bca83b16d2cb67af
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.11.13
|
Release files / pemja-0.6.2-cp312-cp312-macosx_11_0_arm64.whl
| Download URL | pemja-0.6.2-cp312-cp312-macosx_11_0_arm64.whl |
|---|---|
| Size | 56.3 kB |
| Tags | CPython 3.12 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
65379a4979455db48c6030e5a5abb8238e68787ffdf009ff9eb0429210812127
|
|
BLAKE2b-256 checksum How to use checksums |
a8d6ca5ec3a9beaaa01570fcf3c04d2e3904c4928ca6e4b3351de506cb5c2678
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.11.13
|
Release files / pemja-0.6.2-cp312-cp312-macosx_10_13_x86_64.whl
| Download URL | pemja-0.6.2-cp312-cp312-macosx_10_13_x86_64.whl |
|---|---|
| Size | 55.1 kB |
| Tags | CPython 3.12 macOS 10.13+ x86-64 |
|
SHA-256 checksum How to use checksums |
34aeb6679096dee275376f08cf2d98b4f118f7abec057e58dfd9d904a1ecd4d7
|
|
BLAKE2b-256 checksum How to use checksums |
1ce6179198c603fde2c13c1a4a9a58077c4f435d56dc9e1b5ce5c3da34c4935f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.11.13
|
Release files / pemja-0.6.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
| Download URL | pemja-0.6.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl |
|---|---|
| Size | 325.8 kB |
| Tags | CPython 3.11 Linux glibc 2.17+ ARM64 |
|
SHA-256 checksum How to use checksums |
b8f5107fb3753f8d6c2150134a890b7ba85fc10e34fa35424e4c53991e4f79da
|
|
BLAKE2b-256 checksum How to use checksums |
0c525670bf050f8e7a709e6533c852474db80062dac48a3cacc10027bc9ad290
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.11.13
|
Release files / pemja-0.6.2-cp311-cp311-manylinux1_x86_64.whl
| Download URL | pemja-0.6.2-cp311-cp311-manylinux1_x86_64.whl |
|---|---|
| Size | 67.5 kB |
| Tags | CPython 3.11 Linux glibc 2.5+ x86-64 |
|
SHA-256 checksum How to use checksums |
6b50f39d1d66f77416cd8a8d3a8fbeff869129fde5fc9203a9adc3d187fc995c
|
|
BLAKE2b-256 checksum How to use checksums |
5bca0f7a1c6627899ccd2e4de89e9ba7818e0c734ff44cd15fee7d8f9189b21f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.11.13
|
Release files / pemja-0.6.2-cp311-cp311-macosx_11_0_arm64.whl
| Download URL | pemja-0.6.2-cp311-cp311-macosx_11_0_arm64.whl |
|---|---|
| Size | 56.3 kB |
| Tags | CPython 3.11 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
4dca0a344e828bf83b7d058dd7fdde7fb7726f9499b2b593a9847eae25c8141d
|
|
BLAKE2b-256 checksum How to use checksums |
aa2d2602107f8dd3e5a8d141e24d7c5e35f936fb5adc42df9bd12d4eeb9b44a8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.11.13
|
Release files / pemja-0.6.2-cp311-cp311-macosx_10_9_x86_64.whl
| Download URL | pemja-0.6.2-cp311-cp311-macosx_10_9_x86_64.whl |
|---|---|
| Size | 54.8 kB |
| Tags | CPython 3.11 macOS 10.9+ x86-64 |
|
SHA-256 checksum How to use checksums |
86043029c48cad7bfaac83a820d660292349b0e651ca2eac2209f5e6cf22a86c
|
|
BLAKE2b-256 checksum How to use checksums |
249d60d9d987dbc299f2689c60902d2a83bdaa6f5501ec7127289cc277f7e3aa
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.11.13
|
Release files / pemja-0.6.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
| Download URL | pemja-0.6.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl |
|---|---|
| Size | 316.5 kB |
| Tags | CPython 3.10 Linux glibc 2.17+ ARM64 |
|
SHA-256 checksum How to use checksums |
ee2bad2437b5ac7b2ec4349e6a2221eedaa91557696447030f34cce39e316a85
|
|
BLAKE2b-256 checksum How to use checksums |
1dccb08f4f0bfb4f08729aac431c6cfe4b61ad9289524cc25cb63429c83dbd48
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.11.13
|
Release files / pemja-0.6.2-cp310-cp310-manylinux1_x86_64.whl
| Download URL | pemja-0.6.2-cp310-cp310-manylinux1_x86_64.whl |
|---|---|
| Size | 67.6 kB |
| Tags | CPython 3.10 Linux glibc 2.5+ x86-64 |
|
SHA-256 checksum How to use checksums |
d905962d6122b87c232cd5879893247a2101cdfa88e86bef0ad79ae5a92bca2b
|
|
BLAKE2b-256 checksum How to use checksums |
865f456bab8d16dd8553050fa8902ccd630ce166df8116c4b5650d8aa84b5634
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.11.13
|
Release files / pemja-0.6.2-cp310-cp310-macosx_11_0_arm64.whl
| Download URL | pemja-0.6.2-cp310-cp310-macosx_11_0_arm64.whl |
|---|---|
| Size | 56.5 kB |
| Tags | CPython 3.10 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
b07871c288fb328cef917890ecca4f43b32b39b7b1330cde33fdfb02170841da
|
|
BLAKE2b-256 checksum How to use checksums |
c2c1d6bb739091337d4c11dd8daa17587ccc5c8d38d5763a00e385881aea81d6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.11.13
|
Release files / pemja-0.6.2-cp310-cp310-macosx_10_9_x86_64.whl
| Download URL | pemja-0.6.2-cp310-cp310-macosx_10_9_x86_64.whl |
|---|---|
| Size | 55.0 kB |
| Tags | CPython 3.10 macOS 10.9+ x86-64 |
|
SHA-256 checksum How to use checksums |
63cdfdc638b2ac8b52cf0fb6e33f17112f0cc97820bbe32224be17018cda81cb
|
|
BLAKE2b-256 checksum How to use checksums |
4194e9c7a0634d9a5ebb86741a14f4b4fba68c265dacc4773f55123cb22ab59c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.11.13
|
Release files / pemja-0.6.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
| Download URL | pemja-0.6.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl |
|---|---|
| Size | 314.7 kB |
| Tags | CPython 3.9 Linux glibc 2.17+ ARM64 |
|
SHA-256 checksum How to use checksums |
762b153c18a9d60d9e000bb244aefbed3617cd3a95b3a1d9df455f512d69a018
|
|
BLAKE2b-256 checksum How to use checksums |
c9f62eda5615575caa4ce8a1f073bb7100c1d047be56c420d17c8ff3cd1ed9d8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.11.13
|
Release files / pemja-0.6.2-cp39-cp39-manylinux1_x86_64.whl
| Download URL | pemja-0.6.2-cp39-cp39-manylinux1_x86_64.whl |
|---|---|
| Size | 67.3 kB |
| Tags | CPython 3.9 Linux glibc 2.5+ x86-64 |
|
SHA-256 checksum How to use checksums |
77d5ec02b476e741debef553dcfa9b38ef9f47f855e33044a42ad558baffdece
|
|
BLAKE2b-256 checksum How to use checksums |
7f8daa8311f1e99f198f07830e82a8c4f4f565b6f099907da459924e88734038
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.11.13
|
Release files / pemja-0.6.2-cp39-cp39-macosx_11_0_arm64.whl
| Download URL | pemja-0.6.2-cp39-cp39-macosx_11_0_arm64.whl |
|---|---|
| Size | 56.5 kB |
| Tags | CPython 3.9 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
8a3f28b6427c73b45b1c799a3dd5c0d6879258e06e00b224163f9a3a505bca3c
|
|
BLAKE2b-256 checksum How to use checksums |
8c2aecdf8fceb65245f2f2552ce0c3d3e03c65480219f542b1521f52902459a9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.11.13
|
Release files / pemja-0.6.2-cp39-cp39-macosx_10_9_x86_64.whl
| Download URL | pemja-0.6.2-cp39-cp39-macosx_10_9_x86_64.whl |
|---|---|
| Size | 55.0 kB |
| Tags | CPython 3.9 macOS 10.9+ x86-64 |
|
SHA-256 checksum How to use checksums |
10d35288c25852fc9c5589577de78d66166a5a2aa4ae4f11123ae190aff6ec09
|
|
BLAKE2b-256 checksum How to use checksums |
02d0b81affb981bc8a9fdd8e1595c64c159499c5c2d33d3684e57d6fb59a6019
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.11.13
|
Release files / pemja-0.6.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
| Download URL | pemja-0.6.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl |
|---|---|
| Size | 311.4 kB |
| Tags | CPython 3.8 Linux glibc 2.17+ ARM64 |
|
SHA-256 checksum How to use checksums |
4ff034bd1b8d804451ba60cccae8c3399c7e317a43a3b319e7b5933861da38f1
|
|
BLAKE2b-256 checksum How to use checksums |
c64f00e16c9f915d0b3eb281ce60f34435dee734b6016659c75f0ab965cd902f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.11.13
|
Release files / pemja-0.6.2-cp38-cp38-manylinux1_x86_64.whl
| Download URL | pemja-0.6.2-cp38-cp38-manylinux1_x86_64.whl |
|---|---|
| Size | 322.0 kB |
| Tags | CPython 3.8 Linux glibc 2.5+ x86-64 |
|
SHA-256 checksum How to use checksums |
31a8b169db52e5eb46914bd9e99b80ea8720d535b3762b2d918c490998355a0a
|
|
BLAKE2b-256 checksum How to use checksums |
24edee33e5c9ecbd290bda1a53df00c104d683440bf791527ffa0df39a71ce37
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.11.13
|
Release files / pemja-0.6.2-cp38-cp38-macosx_11_0_arm64.whl
| Download URL | pemja-0.6.2-cp38-cp38-macosx_11_0_arm64.whl |
|---|---|
| Size | 56.1 kB |
| Tags | CPython 3.8 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
a63fbd74ec12d475dd5fce3e303667cb1585fd7f2b4dc91ccb04c4319a931d06
|
|
BLAKE2b-256 checksum How to use checksums |
1e90dd9d91d0ded1e29ba2c22c75922cbb64340a4751876e3a033d81612f4bde
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.11.13
|
Release files / pemja-0.6.2-cp38-cp38-macosx_10_9_x86_64.whl
| Download URL | pemja-0.6.2-cp38-cp38-macosx_10_9_x86_64.whl |
|---|---|
| Size | 54.6 kB |
| Tags | CPython 3.8 macOS 10.9+ x86-64 |
|
SHA-256 checksum How to use checksums |
6261834aa30c232ddad5917f9ad58a390c6653789958b1895ce4b346a46e101f
|
|
BLAKE2b-256 checksum How to use checksums |
117379b87bb3cdd7eea2e5f390684430919f0f50ad3c376801b209063f6719d8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.11.13
|