Hướng dẫn can we call python method from java? - chúng ta có thể gọi phương thức python từ java không?

Vâng, điều đó có thể được thực hiện. Thông thường, điều này sẽ được thực hiện bằng cách tạo một đối tượng PythonInterpreter và sau đó gọi lớp Python bằng cách sử dụng đó.

Xem xét ví dụ sau:

Java:

import org.python.core.PyInstance;  
import org.python.util.PythonInterpreter;  


public class InterpreterExample  
{  

   PythonInterpreter interpreter = null;  


   public InterpreterExample()  
   {  
      PythonInterpreter.initialize(System.getProperties(),  
                                   System.getProperties(), new String[0]);  

      this.interpreter = new PythonInterpreter();  
   }  

   void execfile( final String fileName )  
   {  
      this.interpreter.execfile(fileName);  
   }  

   PyInstance createClass( final String className, final String opts )  
   {  
      return (PyInstance) this.interpreter.eval(className + "(" + opts + ")");  
   }  

   public static void main( String gargs[] )  
   {  
      InterpreterExample ie = new InterpreterExample();  

      ie.execfile("hello.py");  

      PyInstance hello = ie.createClass("Hello", "None");  

      hello.invoke("run");  
   }  
} 

Python:

class Hello:  
    __gui = None  

    def __init__(self, gui):  
        self.__gui = gui  

    def run(self):  
        print 'Hello world!'

Ảnh của Peakpx

STEP-BY-STEP-GUIGE

Hướng dẫn này dựa trên macosx với chip M1 cho Python 3,8/3.9 và Java 11

Intro.

Từ 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à nhiệm vụ khi công cụ ứng dụng cơ sở ở Java và tôi được cho là sẽ thêm một tính năng học máy mới. Thách thức quan trọng ở đây là tính năng ML là ở Python.

Vậy chúng ta sẽ làm gì? Chúng tôi áp dụng loại giải pháp nào cho nhiệm vụ này? Một trong những giải pháp làm việc là chạy dịch vụ này trong Docker. Hoặc chúng ta có thể tìm thấy một giải pháp thân thiện với sản xuất khác, hiệu quả hơn: thực hiện mã python trực tiếp từ mã Java thông qua thư viện JEP (Python nhúng Java).Jep library (Java Embedded Python).

Thư viện JEP là gì - một voodoo thuần túy.Pure Voodoo Itself.

Dướ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 phiên dịch viên Python bên trong JVM. Khi bạn tạo một phiên bản phiên dịch trong Java, một trình thông dịch Python sẽ được tạo cho phiên bản phiên dịch Java đó và sẽ ở trong bộ nhớ cho đến khi phiên bản phiên dịch được đóng với Interpreter.close().

Do nhu cầu quản lý trạng thái luồng python nhất quán, một luồng tạo ra một phiên bản phiên dịch phải được sử dụng lại cho tất cả các cuộc 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 thực thi mô -đun Python:

JEP nên làm việc với bất kỳ mô -đun Python thuần túy nào. Nó hoạt động với một loạt các phần mở rộng CPython. Các nhà phát triển đã báo cáo rằng JEP làm việc 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 thỏa thuận với BigData. Các thử nghiệm trong nghiên cứu của tôi cho thấy rằng sử dụng JEP gần như thực thi Python thuần túy.

Làm thế nào để thiết lập JEP cho dự án của bạn.

Giả sử bạn có Java (Maven) và Python trong hệ thống của bạn. Trong dự án Java, trong pom.xmlFile, bạn đã đặt một sự phụ thuộc:In the Java project, in the pom.xmlfile, you set a dependency:

Sự phụ thuộc pom.xml để chạy python từ java

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, Run:in Python, run:

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 nó. Trong ví dụ của tôi, tôi sử dụng phiên bản JEP 4.0.3.

Phiên bản không tương thích là đáng kể ở đây. Phiên bản Python càng thấp và phiên bản thư viện JEP bạn sẽ thực hiện, cú pháp Java phức tạp hơn bạn sẽ sử dụng (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 hiện 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 một 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 cùng một dòng vào tệp

class Hello:  
    __gui = None  

    def __init__(self, gui):  
        self.__gui = gui  

    def run(self):  
        print 'Hello world!'
0 của bạn! JEP đang tìm kiếm tệp
class Hello:  
    __gui = None  

    def __init__(self, gui):  
        self.__gui = gui  

    def run(self):  
        print 'Hello world!'
1 trên macOS và
class Hello:  
    __gui = None  

    def __init__(self, gui):  
        self.__gui = gui  

    def run(self):  
        print 'Hello world!'
2Fileon Linux.

Bên cạnh tất cả, đố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 hiện Python trực tiếp từ Java.

Cú pháp cho chip macOSx M1 Python 3.8.

Đầu 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 Java

Thứ hai - để thiết lập các 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 tôi). Sau đó, tạo một đối tượng SharedInterPreter. Chia sẻ Interpreter 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ác cấu hình JEP và để tạo một công cụ chia sẻ để thực hiện Python

Tô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 bạn đã cài đặt trong thư viện Python Spacy với các mô hình đã tải xuống trước khi JEP Run:

Ví dụ về các chức năng Python đơn giản để kiểm tra JEP

Bây giờ, chúng ta hãy chạy các chức năng tài liệu Python từ Java:

Ví dụ về chức năng chạy từ tài liệu python_functions.py (Python 3.8)

Đầ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 hiện Python trực tiếp từ Java! Nhưng chờ đã, những gì về cú pháp cho các phiên bản Python khác mà tôi đã đề cập ở đầu bài viết?

Cú pháp cho chip macOSx M1 Python 3.9.

Tôi đã nói trước các phiên bản Python và JEP cao hơn, cú pháp đơn giản hơn trong Java. Đó là như vậy bởi vì, trong các phiên bản JEP mới nhất cho các phiên bản Python 3.9+, các nhà phát triển JEP đã thêm một tìm kiếm tự động cho đường dẫn Python khi bạn thực hiện Cài đặt PIP PIP JEP. Hãy xem cú pháp dưới đây!

Ví dụ về cách đặt đường dẫn cho JEP và tạo trình điều khiển con để thực hiện Python3.9

Bốn dòng mã, và chúng tôi có một trình thông dịch Python3.9 trong Java! Bây giờ bạn sẽ thấy cách chạy các chức năng Python từ tài liệu mà bạn đã thấy.

Ví dụ về cách chạy các chức năng Python3.9 từ Java Jep

Các bản in sẽ giống như đối với phiên bản Python 3.8. Đó là tất cả mọi người !!

Conclusions.

Trong hướng dẫn này, bạn đã nhận được hướng dẫn rõ ràng về cách thực hiện mã Python của mình từ bất kỳ ứng dụng Java nào cho các phiên bản Python 3.8 và Python 3.9.

Tất cả các ví dụ về mã trong bài viết bạn có thể chạy trên chip và Linux của MacOSx M1. Bạn chỉ cần thiết lập chính xác thư viện JEP cho mỗi hệ thống.

Sources.

  1. Thư viện JEP GitHub
  2. Dự án GitHub của tôi với các ví dụ mã

Python và Java có thể làm việc cùng nhau không?

Python là ngôn ngữ kịch bản hướng đối tượng, tự động biến nó thành một cặp tốt cho Java.Nhưng khi kết hợp với một thông dịch viên Python được viết hoàn toàn bằng Java, như Jython, bạn có thể làm những việc như viết toàn bộ applet trong Python.automatically makes it a good pair for Java. But when combined with a Python interpreter written entirely in Java, like Jython, you could do things like write entire applets in Python.

Làm cách nào để kết nối mã python với mã java?

Bắt đầu..
Tiêm một đối số chuỗi sẽ được sử dụng bởi mã Python: Đối số tập lệnh Python của chúng tôi có tên user_name sẽ nhận được giá trị của biến tên mã Java của chúng tôi ..
Thực thi mã Python bằng phương thức EXEC () ..
Nhận giá trị trả lại từ Python trở lại Java ..

Chúng ta có thể sử dụng Python trong Spring Boot không?

Chúng tôi có thể sử dụng triển khai Python của chúng tôi giống như chúng tôi sẽ sử dụng một dịch vụ mùa xuân bình thường.Đó chỉ là một ví dụ đơn giản nhưng sẽ không khác nhiều nếu chúng ta cần tạo ra các lớp Python phức tạp hơn dựa vào các thư viện bên ngoài, v.v. Chúng ta cũng có thể mở rộng các lớp Java trong Python.. That was just a simple example but it wouldn't be much different if we need to create more complex python classes that rely on external libraries, etc. We can also extend Java classes in Python.