pip install JPype1
ví dụ/trăn/java. py
from jpype import startJVM, shutdownJVM, java #startJVM[getDefaultJVMPath[], "-ea"] startJVM[convertStrings=False] java.lang.System.out.println["hello world"] random = java.util.Random[] number1 = random.nextInt[10] number2 = random.nextInt[10] print[number1, number2] shutdownJVM[]
Xem hướng dẫn sử dụng jpype
Tôi đã thử Python 3 này. 7. 3 chạy trên Linux
$ java -version openjdk version "1.8.0_242" OpenJDK Runtime Environment [build 1.8.0_242-8u242-b08-0ubuntu3~19.10-b08] OpenJDK 64-Bit Server VM [build 25.242-b08, mixed mode]
$ sudo apt-get install openjdk-8-jdk-headless $ javac -version javac 1.8.0_242
ví dụ/trăn/java1/Máy tính. java
public class Calculator { public static Integer add[Integer a, Integer b] { return a*b; } }ví dụ/python/java1/org/pkg/MyMath. java_______5_______ví dụ/python/java1/calc. py_______6_______
javac Calculator.java javac org/pkg/MyMath.java python calc.py
Bố cục thư mục [trước khi chạy javac]
________số 8_______Javabridge tải một lớp Java, org. hồ sơ di động. javabridge. CPython, có thể được sử dụng để thực thi mã Python. Lớp này có thể được sử dụng trong mã Java được gọi từ trình thông dịch Python hoặc nó có thể được sử dụng trong Java để chạy Python nhúng trong Java
lớporg.cellprofiler.javascript.
CPython
[]Lớp CPython liên kết trình thông dịch Python với JVM và cung cấp khả năng thực thi các tập lệnh Python
exec
[]Tranh luận- tập lệnh – Tập lệnh Python để thực thi
- locals – Bản đồ tên của đối tượng Java trong bối cảnh thực thi Python tới chính đối tượng Java. Các đối tượng trong bản đồ có phạm vi cục bộ. Giá trị null có thể được sử dụng nếu không cần xác định cục bộ
- toàn cầu – Bản đồ tên của đối tượng Java với chính đối tượng Java. Các đối tượng trong bản đồ có phạm vi toàn cầu. Nếu một giá trị null được sử dụng, thì
globals
mặc định là toàn cục dựng sẵn
exec[]
thực thi tập lệnh được truyền trong trình thông dịch Python. Trình thông dịch thêm các toàn cầu dựng sẵn vào các toàn cầu được truyền vào, sau đó thực thi tập lệnh. Cùng một bản đồ có thể được sử dụng cho cả địa phương và toàn cầu - chế độ này có vẻ quen thuộc hơn với những người thường xuyên viết mã bằng Python và mong đợi câu lệnh import
có tác dụng toàn cầu
Không có phương pháp eval
. Bạn có thể truy xuất các giá trị bằng cách chuyển một đối tượng vùng chứa, chẳng hạn như một mảng hoặc bản đồ làm một trong các đối tượng cục bộ và bạn có thể đặt các phần tử trong đối tượng với các giá trị được trả về
Thí dụ
class MyClass { static final CPython cpython = CPython[]; public List whereIsWaldo[String root] { ArrayList result = new ArrayList[]; Hashtable locals = new Hashtable[]; locals.put["result", result]; locals.put["root", root]; StringBuilder script = new StringBuilder[]; script.append["import os\n"]; script.append["import javabridge\n"]; script.append["root = javabridge.to_string[root]"]; script.append["result = javabridge.JWrapper[result]"]; script.append["for path, dirnames, filenames in os.walk[root]:\n"]; script.append[" if 'waldo' in filenames:"]; script.append[" result.add[path]"]; cpython.exec[script.toString[], locals, null]; return result; } }
execute
[]import javabridge cpython = javabridge.JClassWrapper['org.cellprofiler.javabridge.CPython'][] d = javabridge.JClassWrapper['java.util.Hashtable'][] result = javabridge.JClassWrapper['java.util.ArrayList'][] d.put["result", result] cpython.execute[ 'import javabridge\n' 'x = { "foo":"bar"}\n' 'ref_id = javabridge.create_and_lock_jref[x]\n' 'javabridge.JWrapper[result].add[ref_id]', d, d] cpython.execute[ 'import javabridge\n' 'ref_id = javabridge.to_string[javabridge.JWrapper[result].get[0]]\n' 'assert javabridge.redeem_jref[ref_id]["foo"] == "bar"\n' 'javabridge.unlock_jref[ref_id]', d, d]0 là một từ đồng nghĩa với
import javabridge cpython = javabridge.JClassWrapper['org.cellprofiler.javabridge.CPython'][] d = javabridge.JClassWrapper['java.util.Hashtable'][] result = javabridge.JClassWrapper['java.util.ArrayList'][] d.put["result", result] cpython.execute[ 'import javabridge\n' 'x = { "foo":"bar"}\n' 'ref_id = javabridge.create_and_lock_jref[x]\n' 'javabridge.JWrapper[result].add[ref_id]', d, d] cpython.execute[ 'import javabridge\n' 'ref_id = javabridge.to_string[javabridge.JWrapper[result].get[0]]\n' 'assert javabridge.redeem_jref[ref_id]["foo"] == "bar"\n' 'javabridge.unlock_jref[ref_id]', d, d]1 là một từ khóa Python. Sử dụng
import javabridge cpython = javabridge.JClassWrapper['org.cellprofiler.javabridge.CPython'][] d = javabridge.JClassWrapper['java.util.Hashtable'][] result = javabridge.JClassWrapper['java.util.ArrayList'][] d.put["result", result] cpython.execute[ 'import javabridge\n' 'x = { "foo":"bar"}\n' 'ref_id = javabridge.create_and_lock_jref[x]\n' 'javabridge.JWrapper[result].add[ref_id]', d, d] cpython.execute[ 'import javabridge\n' 'ref_id = javabridge.to_string[javabridge.JWrapper[result].get[0]]\n' 'assert javabridge.redeem_jref[ref_id]["foo"] == "bar"\n' 'javabridge.unlock_jref[ref_id]', d, d]0 thay cho
import javabridge cpython = javabridge.JClassWrapper['org.cellprofiler.javabridge.CPython'][] d = javabridge.JClassWrapper['java.util.Hashtable'][] result = javabridge.JClassWrapper['java.util.ArrayList'][] d.put["result", result] cpython.execute[ 'import javabridge\n' 'x = { "foo":"bar"}\n' 'ref_id = javabridge.create_and_lock_jref[x]\n' 'javabridge.JWrapper[result].add[ref_id]', d, d] cpython.execute[ 'import javabridge\n' 'ref_id = javabridge.to_string[javabridge.JWrapper[result].get[0]]\n' 'assert javabridge.redeem_jref[ref_id]["foo"] == "bar"\n' 'javabridge.unlock_jref[ref_id]', d, d]1 để gọi Python từ CWrapper javabridge cho CPython
Duy trì các tham chiếu đến các giá trị Python
Bạn có thể muốn duy trì các tham chiếu đến các đối tượng Python trong quá trình thực thi tập lệnh. Các hàm sau đây cho phép người gọi Java tham chiếu đến giá trị Python [có thể là loại cơ sở hoặc đối tượng] thông qua mã thông báo có thể được trao đổi lấy giá trị bất kỳ lúc nào. Mã Java chịu trách nhiệm quản lý thời gian tồn tại của tham chiếu. Thí dụ