Java có thể kết nối với Python không?
Trong hướng dẫn này, chúng tôi sẽ chỉ cho bạn cách tích hợp mã Java và Python một cách gần như liền mạch chỉ với một vài bước đơn giản
jép là gì?Jep là một thư viện mã nguồn mở cung cấp cho bạn khả năng thực thi mã Python trong Java và ngược lại Giả sử bạn có một ứng dụng Java hiện có và bạn cần sử dụng một số thư viện của bên thứ 3. Thật không may, thư viện này chỉ được triển khai trong Python nên bạn không thể thực sự sử dụng nó như một phần của ứng dụng của mình. Jep sẽ giúp bạn giải quyết chính xác vấn đề đó Bên cạnh đó, có những thư viện khác sẽ giúp bạn đạt được mục tiêu tương tự như jpy và jython chẳng hạn, nhưng chúng ít phổ biến hơn hoặc không được duy trì tích cực như Jep. Thiết lập môi trường của bạn
pip install jep
implementation group: 'black.ninia', name: 'jep', version: '3.9.1'
-Djava.library.path=/Users/<YOUR_USERNAME>/Library/Python/3.9/lib/python/site-packages/jep Bắt đầuBây giờ mọi thứ đã được thiết lập, chúng tôi sẽ chỉ cho bạn cách làm việc với Jep Trước tiên, chúng ta cần tạo một phiên bản SharedInterpreter mới mà chúng ta sẽ sử dụng xuyên suốt mã Java của mình Sau đó, sử dụng thông dịch viên đó, chúng tôi sẽ
Đó là nó. Nó đơn giản như vậy Bây giờ bạn có thể cài đặt bất kỳ thư viện Python nào bạn cần, nhập nó vào mã Python của bạn và sau đó thực thi nó như một phần của mã Java của bạn Chạy một kịch bảnTrường hợp sử dụng phổ biến hơn cho Jep là chạy toàn bộ tập lệnh Python bằng một lệnh Java. Bằng cách này, bạn không cần phải gọi đi gọi lại phương thức exec() cho mỗi dòng mã Python mà bạn có Cách tiếp cận này rất hữu ích trong trường hợp bạn có mã Python hiện có mà bạn muốn thực thi như một phần của ứng dụng Java của mình loại chuyển đổiMọi loại Java được gửi tới Python bằng trình thông dịch đang được chuyển đổi thành đối tác của nó. Điều này áp dụng cho cả nguyên thủy và cấu trúc dữ liệu phức tạp như đối tượng và bộ sưu tập Vì vậy, ví dụ: danh sách của Python sẽ được chuyển đổi thành ArrayList của Java và dict của Python sẽ được chuyển đổi thành HashMap của Java, v.v. Mọi thứ được thực hiện tự động nên bạn không phải lo lắng về điều đó Hệ sinh thái GraalVM bao gồm một bộ ngôn ngữ rất thú vị. Mã bit JavaScript, Ruby, Python, WebAssugging, Java, LLVM, v.v. Tất cả đều mang lại những lợi thế riêng. Python trên GraalVM mở ra hệ sinh thái phong phú gồm các thư viện khoa học dữ liệu Python cho các nhà phát triển Java. Mặc dù hỗ trợ Python trên GraalVM vẫn đang ở giai đoạn thử nghiệm, nhưng bạn có thể sử dụng nó ngay hôm nay để mở rộng các ứng dụng Java của mình bằng mã Python và thư viện Trong bài viết này, chúng ta xem xét một ứng dụng ví dụ được phát triển bởi các sinh viên tại Viện Hasso Plattner (HPI) ở Potsdam, ứng dụng này có thể được sử dụng làm mẫu để sử dụng các thư viện Python từ Java trên GraalVM. Mã nguồn đầy đủ có sẵn tại kho GitHub của HPI Software Architecture Group Nếu bạn muốn tìm hiểu thêm ngữ cảnh về ứng dụng được mô tả trong bài viết này, cách triển khai Graalpython, hiệu suất của nó và hơn thế nữa, hãy xem Sử dụng Python từ Java với GraalVM Mẫu này là một ứng dụng Java AWT mẫu có thể hiển thị các hàm nhị thức bằng thư viện PyGal Python. Hãy xem qua mã của mẫu. Lưu ý rằng chúng tôi đã đơn giản hóa nó một chút vì mục đích rõ ràng Câu hỏi đầu tiên là - làm thế nào để bắt đầu? . Để tích hợp Python hoạt động trơn tru, chúng tôi xem xét các khía cạnh sau khi viết POM Cách duy nhất được hỗ trợ để chạy Python trên GraalVM là sử dụng các bản dựng GraalVM và cài đặt thành phần Python. Đảm bảo chúng tôi chạy trên GraalVM trong dự án Maven khá đơn giản. Chúng tôi sử dụng Cấu hình trên kiểm tra tệp thực thi `graalpython` trong thư mục `JAVA_HOME` và nếu không tìm thấy, quá trình xây dựng sẽ thất bại với thông báo lỗi hữu ích Việc cài đặt các gói Python với Maven liên quan nhiều hơn một chút và yêu cầu một chút hiểu biết về cách các ứng dụng Python thường được đóng gói và phân phối. Các gói và thư viện Python có thể được cài đặt trên toàn hệ thống hoặc cho mỗi người dùng, nhưng điều đó hiếm khi được mong muốn nếu chúng ta muốn phân phối các ứng dụng độc lập và tránh xung đột với phần còn lại của hệ thống. Vì lý do đó, cộng đồng Python khuyến nghị sử dụng mô-đun Môi trường ảo được tạo đơn giản bằng cách chạy mô-đun implementation group: 'black.ninia', name: 'jep', version: '3.9.1' 0 trong thư mục implementation group: 'black.ninia', name: 'jep', version: '3.9.1' 1 của nó có thể được sử dụng để cài đặt các gói Python từ PyPI vào môi trườngĐể chuẩn bị môi trường ảo, chúng tôi sử dụng implementation group: 'black.ninia', name: 'jep', version: '3.9.1' 2. Chúng tôi gọi mô-đun venv đã được vận chuyển cùng với GraalVM Python của chúng tôi (được tìm thấy trong JAVA_HOME như được đảm bảo ở trên), sau đó sử dụng trình khởi chạy implementation group: 'black.ninia', name: 'jep', version: '3.9.1' 0 để cài đặt PyGal, do đó đảm bảo rằng một maven-enforcer-plugin 3 đơn giản sẽ cài đặt các gói Python cần thiếtgói chúng lênGói tài nguyên được tích hợp vào Maven như một mối quan tâm cốt lõi, vì vậy chúng ta chỉ cần hiểu những tài nguyên đó là gì trong trường hợp của Python. Khi chúng tôi tạo một môi trường ảo, một cấu trúc thư mục đã được tạo bao gồm các trình khởi chạy và các gói chúng tôi đã cài đặt. Bạn có thể muốn cắt giảm kích thước bằng cách chỉ gói các gói. Điều này là không nên, tuy nhiên Python và công cụ của nó được xây dựng xung quanh dòng lệnh và môi trường ảo cũng vậy. Trên thực tế, môi trường ảo sử dụng chính các tệp thực thi làm điểm đánh dấu cho nơi tìm gói. Vì chúng tôi không muốn dựa vào việc triển khai chính xác cách thức hoạt động của tính năng này nên chúng tôi chỉ gói gọn mọi thứ Kết nối Java với PythonHàm Điều thú vị đầu tiên là cách sử dụng API nhúng chính xác với môi trường ảo Python mà chúng tôi đã tạo. Để làm như vậy, chúng ta phải đặt một số tùy chọn trước khi tạo GraalVM Hãy đi qua điều này. Đầu tiên, chúng tôi tạo một Hai cuộc gọi Điều này có thể không phải lúc nào cũng được mong muốn đối với nhúng Python và do đó chúng tôi cần tùy chọn đầu tiên, Chúng tôi có thể sử dụng trực tiếp API nhúng để nhận các phiên bản Chúng tôi phải đánh giá một số mã Python, nhưng chúng tôi sẽ thiết lập nó để chúng tôi chỉ cần nhập một lớp Python triển khai giao diện Bây giờ chúng ta đã thiết lập giao diện mà chúng ta muốn mã Java trông như thế nào, hãy bắt đầu viết một tệp Python để tải. API PyGal hơi quá thấp so với mục đích của chúng tôi. Để phù hợp với giao diện Mã nên làm gì? Như bạn có thể thấy, chúng tôi chỉ đánh giá chuỗi mà người dùng đưa vào trường nhập liệu. Mã này không thực hiện bất kỳ kiểm tra lỗi nào, nhưng người dùng thực sự có thể đang chạy bất kỳ biểu thức Python nào ở đây, vì vậy trong một ứng dụng thực, chúng ta nên cẩn thận hơn khi xác thực đầu vào và chúng ta nên cân nhắc sử dụng các tính năng hộp cát của GraalVM để giảm thiểu khả năng của Python Khi chúng tôi có các giá trị, chúng tôi chỉ cần gọi PyGal để hiển thị SVG. Dữ liệu SVG là một đối tượng Python Vì giao diện Java yêu cầu giá trị trả về Ở đây, Vậy làm cách nào để triển khai Một điều đáng tiếc là lớp trừu tượng InputStream có một phương thức Cuối cùng, chúng ta cần xuất Bây giờ chúng ta đã sắp xếp cách các thành phần tương tác và đã viết mã xung quanh nó, hãy chạy ứng dụng của chúng ta bằng lệnh Đơn giản mà đẹp. Bạn có thể gõ Với GraalVM Native Image, chúng tôi có một công nghệ để biên dịch mã Java trước thời hạn. Chúng tôi đang tích cực làm việc để cho phép duy trì mã Python khởi động để ứng dụng có thể chạy nhanh trong lần hiển thị đầu tiên. Chúng tôi đã có một nguyên mẫu của tính năng này và hy vọng sẽ làm sáng tỏ tính năng đó cho Python trong tương lai không xa kết luậnNhúng Python vào các ứng dụng Java chạy trên GraalVM thật dễ dàng, nhưng việc sử dụng các gói Python đúng cách đi kèm với một số cạm bẫy mà chúng ta cần lưu ý. Với kho lưu trữ mẫu nhỏ được thảo luận trong bài viết này, bất kỳ ai cũng có thể thiết lập và chạy với nó một cách nhanh chóng và tránh được một số trở ngại và trở ngại khi khởi động. Hãy thử một lần. Chúng tôi luôn hoan nghênh phản hồi trên Github, Slack hoặc thậm chí ở đây trong các nhận xét. Từ các yêu cầu tính năng đến các sự cố giúp chúng tôi ưu tiên các gói trong hệ sinh thái, tất cả đều là thông tin đầu vào có giá trị giúp GraalVM trở thành một thời gian chạy tuyệt vời cho Java và Python |