Theo thực tế của tôi, một trong những trường hợp cuối cùng tôi gặp là tác vụ khi công cụ ứng dụng cơ sở ở Java và tôi phải thêm tính năng Học máy mới. Thách thức chính ở đây là tính năng ML có trong Python
Vậy chúng ta sẽ làm gì? . Hoặc chúng ta có thể tìm một giải pháp thân thiện với sản xuất hiệu quả hơn. để thực thi mã python trực tiếp từ mã Java thông qua thư viện Jep [Java Embedded Python]
Thư viện JEP là gì — Bản thân Voodoo thuần túyDưới đây là một số trích dẫn từ Câu hỏi thường gặp của họ trên GitHub
Jep sử dụng JNI và API CPython để khởi động trình thông dịch Python bên trong JVM. Khi bạn tạo một phiên bản Thông dịch viên trong Java, một trình thông dịch Python sẽ được tạo cho phiên bản Thông dịch viên Java đó và sẽ lưu trong bộ nhớ cho đến khi phiên bản Thông dịch viên được đóng bằng
Interpreter.close[].
Do nhu cầu quản lý trạng thái luồng Python nhất quán, luồng tạo phiên bản Phiên dịch phải được sử dụng lại cho tất cả các lệnh gọi phương thức đến phiên bản Phiên dịch đó
Và đây là một trích dẫn liên quan đến việc thực thi mô-đun Python
Jep nên hoạt động với bất kỳ mô-đun Python thuần túy nào. Nó hoạt động với nhiều tiện ích mở rộng CPython. Các nhà phát triển đã báo cáo rằng Jep hoạt động với NumPy, Scipy, Pandas, TensorFlow, Matplotlib, cvxpy, v.v.
Hiệu suất tốc độ là một số liệu quan trọng, đặc biệt nếu ứng dụng của bạn xử lý Dữ liệu lớn. Các thử nghiệm trong nghiên cứu của tôi cho thấy rằng việc sử dụng JEP gần như là thực thi python thuần túy
Cách thiết lập JEP cho dự án của bạnGiả sử bạn có Java [Maven] và Python trong hệ thống của mình. Trong dự án Java, trong tệp pom.xml
, bạn đặt một phụ thuộc
Chạy trong thiết bị đầu cuối dự án
mvn clean installormvn clean install -DskipTests
Bạn đã cài đặt JEP trong Java
Để cài đặt JEP trong Python, hãy chạy
pip install jep
Lệnh này cài đặt phiên bản JEP mới nhất. Bạn có thể chỉ định một phiên bản JEP cụ thể nếu bạn cần. Trong ví dụ của tôi, tôi sử dụng JEP 4. 0. 3 phiên bản
Phiên bản không tương thích là đáng kể ở đây. Phiên bản Python và phiên bản thư viện Jep càng thấp, bạn càng sử dụng cú pháp java phức tạp hơn [và ngược lại]. Nhưng các phiên bản JEP mới nhất có thể dễ dàng thực thi cú pháp của các phiên bản cũ của JEP
Trong hệ thống của bạn bắt buộc phải thiết lập biến môi trường. Đối với macOSX, nó sẽ giống như chạy trong thiết bị đầu cuối
export DYLD_LIBRARY_PATH="/myenv/lib/python3.8/site-packages/jep"$DYLD_LIBRARY_PATH
Và đừng quên thêm dòng tương tự vào tệp ~/.zshrc
của bạn. JEP đang tìm tệp libjep.jnilib
trên macOS và tệp libjep.so
trên Linux
Bên cạnh đó, đối với hệ thống Linux, nó sẽ là một tên biến môi trường khác
export LD_LIBRARY_PATH="/myenv/lib/python3.8/site-packages/jep"$LD_LIBRARY_PATH
Bạn thiết lập thư viện JEP. Bây giờ bạn có thể thực thi Python trực tiếp từ Java
Cú pháp cho Python 3. 8 chip macOSX M1Trước tiên, chúng ta nên xác định đường dẫn thư viện JEP [cụ thể là nơi Java sẽ tìm kiếm Python để thực thi] và khởi tạo đối tượng MainInterpreter
Ví dụ về cách thiết lập Đường dẫn Python cho thư viện Jep trong JavaThứ hai — để thiết lập cấu hình JEP [chúng ta nên thêm các thư viện Python để vận hành và các thư mục dự án của chúng ta]. Sau đó, tạo một đối tượng SharedInterpreter. SharedInterpreter trực tiếp sẽ thực thi mã python hoặc tài liệu điều hành python
Ví dụ về cách thiết lập cấu hình Jep và tạo SharedInterpreter để thực thi PythonTôi có một tài liệu python với hai chức năng đơn giản để kiểm tra công việc của JEP. Một chức năng nên sử dụng thư viện Python gốc để tìm kiếm các tài liệu cụ thể trong thư mục. Hàm thứ hai gọi thư viện Python phức tạp hơn, Spacy. Đảm bảo rằng bạn đã cài đặt trong Python thư viện Spacy với các mô hình đã tải xuống trước khi chạy Jep
Ví dụ về các hàm Python đơn giản để kiểm tra JepBây giờ, chúng ta hãy chạy các hàm tài liệu Python từ Java
đầu ra là
>>> [Apple, Apple, PROPN, NNP, nsubj, Xxxxx, true, false]
>>> [is, be, AUX, VBZ, aux, xx, true, true]
>>> [looking, look, VERB, VBG, ROOT, xxxx, true, false]
>>> [at, at, ADP, IN, prep, xx, true, true]
>>> [buying, buy, VERB, VBG, pcomp, xxxx, true, false]
>>> [U.K., U.K., PROPN, NNP, dobj, X.X., false, false]
>>> [startup, startup, VERB, VBD, dep, xxxx, true, false]
>>> [for, for, ADP, IN, prep, xxx, true, true]
>>> [$, $, SYM, $, quantmod, $, false, false]
>>> [1, 1, NUM, CD, compound, d, false, false]
>>> [billion, billion, NUM, CD, pobj, xxxx, true, false]
Điều này thật tuyệt. Chúng ta có thể gọi và thực thi Python trực tiếp từ Java. Nhưng khoan, còn cú pháp cho các phiên bản Python khác mà tôi đã đề cập ở đầu bài viết thì sao?
Cú pháp cho Python 3. 9 chip macOSX M1Mình đã nói trước các bản Python và Jep cao hơn, cú pháp trong Java đơn giản hơn. Đó là bởi vì, trong các phiên bản Jep mới nhất cho Python 3. 9+ phiên bản, Nhà phát triển JEP đã thêm tính năng tự động tìm kiếm đường dẫn Python khi bạn thực hiện “pip install jep”. Hãy xem cú pháp dưới đây
Ví dụ về cách đặt đường dẫn cho jep và tạo SubInterpreter để thực thi python3. 9Bốn dòng mã và chúng tôi có một python3. 9 Thông dịch viên trong Java. Bây giờ bạn sẽ thấy cách chạy các hàm Python từ tài liệu mà bạn đã xem
Ví dụ về cách chạy python3. 9 hàm từ Java JepCác bản in sẽ giống như đối với Python 3. 8 phiên bản. Đó là tất cả mọi người
kết luậnTrong hướng dẫn này, bạn đã có hướng dẫn rõ ràng về cách thực thi mã Python của mình từ bất kỳ ứng dụng Java nào cho Python 3. 8 và Trăn 3. 9 phiên bản
Tất cả code ví dụ trong bài bạn có thể chạy trên chip macOS M1 và Linux. Bạn chỉ cần setup đúng thư viện Jep cho từng hệ thống