2009-07-13 36 views
40

Tôi có một ứng dụng Java cần tích hợp với thư viện của bên thứ ba. Thư viện được viết bằng Python, và tôi không có bất kỳ lời nói nào về điều đó. Tôi đang cố gắng tìm ra cách tốt nhất để tích hợp với nó. Tôi đang thử JEPP (Java Embedded Python) - có ai từng sử dụng nó trước đây không? Suy nghĩ khác của tôi là sử dụng JNI để giao tiếp với các ràng buộc C cho Python.Tích hợp Java Python

Bất kỳ suy nghĩ nào về cách tốt nhất để làm điều này sẽ được đánh giá cao. Cảm ơn.

+1

Nếu thư viện python là tất cả được viết bằng python tinh khiết, những gì về việc sử dụng Jython? – fabrizioM

Trả lời

28

Tại sao không sử dụng Jython? Nhược điểm duy nhất tôi ngay lập tức có thể nghĩ là nếu thư viện của bạn sử dụng phần mở rộng gốc CPython.

CHỈNH SỬA: Nếu bạn có thể sử dụng Jython bây giờ nhưng nghĩ rằng bạn có thể gặp sự cố với phiên bản thư viện sau này, tôi khuyên bạn nên cách ly thư viện khỏi ứng dụng của mình (ví dụ: một số loại giao diện bộ điều hợp). Đi với những điều đơn giản nhất mà làm việc cho thời điểm này, sau đó xem xét JNI/CPython/etc nếu và khi bạn cần. Có rất ít để đạt được bằng cách đi (đau đớn) JNI tuyến đường, trừ khi bạn thực sự phải.

+0

Tôi đã xem các thư viện Jython. Vấn đề là tôi không đảm bảo rằng các thư viện tôi đang sử dụng không (hoặc sẽ không trong tương lai) sử dụng các phần mở rộng gốc. –

+0

Tôi sẽ làm điều đó. Cảm ơn. Tôi có cần phải thêm bất cứ điều gì đặc biệt vào một tập tin py để chạy nó với Jython? Hoặc nếu nó là python bản địa, nó có nên chạy không? –

+0

Tôi không có nhiều kinh nghiệm với Jython - tham khảo tài liệu :) –

4

Bạn đã cân nhắc chạy Jython trên máy ảo Java chưa?

+0

IronPython dành cho .NET, không phải Java. IKVM có thể đoàn kết ba khả năng, nhưng ick :) –

+0

Có, có dây của tôi vượt qua. – cletus

+1

Tôi đã bỏ lỡ một tham chiếu đến IronPython ở nơi khác? –

4

Bạn có thể sử dụng một dịch vụ nhắn tin như ActiveMQ. Nó có cả hai hỗ trợ Python và Java. Bằng cách này, bạn có thể để lại các ràng buộc JNI hoặc C phức tạp như chúng và xử lý hoàn toàn với những gì tôi xem xét một giao diện đơn giản. Hơn nữa, khi thư viện được cập nhật, bạn không cần thay đổi nhiều, nếu có.

13

Frankly hầu hết các cách bằng cách nào đó chạy Python trực tiếp từ bên trong JVM không hoạt động. Chúng tương đối không tương thích (bản phát hành mới của thư viện bên thứ ba có thể sử dụng các tính năng python 2.6 và sẽ không hoạt động với Jython 2.5) hoặc hacky (nó sẽ phá vỡ với chồng chéo JVM khó hiểu không thực sự dẫn đến giải pháp).

Cách ưa thích của tôi để tích hợp cả hai sẽ sử dụng RPC. XML RPC không phải là lựa chọn tồi ở đây, nếu bạn có lượng dữ liệu vừa phải. Nó được hỗ trợ khá tốt — Python có trong thư viện chuẩn của nó. Các thư viện Java cũng dễ tìm. Bây giờ tùy thuộc vào thiết lập của bạn hoặc là phần Java hoặc Python sẽ là một máy chủ chấp nhận kết nối từ ngôn ngữ khác.

Cách thức thay thế ít phổ biến hơn nhưng đáng xem xét để thực hiện RPC là trình khởi động trước Google, có 2/3 hỗ trợ cho nice rpc. Bạn chỉ cần cung cấp lớp vận chuyển của bạn. Không phải là nhiều công việc và sự tiện lợi của văn bản là hợp lý.

Một tùy chọn khác là viết trình bao bọc C xung quanh các phần chức năng Python mà bạn cần để hiển thị với Java và sử dụng nó thông qua các plugin gốc của JVM. Bạn có thể giảm đau bằng cách đi với SWIG SWIG.

Về cơ bản trong trường hợp của bạn nó hoạt động như thế:

  1. Tạo một giao diện SWIG cho tất cả các phương pháp các cuộc gọi từ Java đến C++.
  2. Tạo mã C/C++ sẽ nhận cuộc gọi của bạn và gọi nội bộ thông dịch viên python bằng thông số chính xác.
  3. Chuyển đổi phản hồi bạn nhận được từ python và gửi nó qua swig quay lại mã Java của bạn.

Giải pháp này khá phức tạp, một chút quá mức cần thiết trong hầu hết các trường hợp. Tuy nhiên nó là giá trị làm nếu bạn (vì lý do nào đó) không thể đủ khả năng RPC. RPC vẫn sẽ là lựa chọn ưa thích của tôi.

+5

Tính tương thích không phải JVM này là thiếu sót lớn nhất của Python. Đó là lý do tại sao chúng tôi quyết định sử dụng Scala. Nó thậm chí còn tốt hơn. – Jus12

+0

Marcin, cách gọi từ xa không được mong muốn cho việc triển khai dữ liệu lớn (thuật toán hoặc ứng dụng) vì lý do hiệu suất và khả năng mở rộng. Quả thực "không hoàn toàn tương thích" là một vấn đề nhưng "phá vỡ với bối rối JVM stacktrace" đòi hỏi một số lời giải thích và ví dụ xin vui lòng. Bạn có nghĩa là khó khăn để gỡ lỗi hoặc không chạy? Tôi đang thử Jep mà JNI trong quá trình và có vẻ như là điều tốt nhất. https://github.com/mrj0/jep/wiki/How-Jep-Works. Suy nghĩ? – SemanticBeeng

7

Suy nghĩ khác của tôi là sử dụng JNI để giao tiếp với các ràng buộc C cho Python.

Tôi thích rất nhiều JNA:

JNA cung cấp các chương trình Java dễ dàng truy cập vào các thư viện chia sẻ nguồn gốc (DLL trên Windows) mà không cần viết bất cứ điều gì nhưng mã không có Java JNI hoặc mã gốc là bắt buộc. Chức năng này có thể so sánh được với các nền tảng Windows/Invoke và Python của Windows. Truy cập là động trong thời gian chạy mà không cần tạo mã.

My 0.02 $ :)

4

Nhiều năm sau, chỉ cần thêm một lựa chọn mà là phổ biến hơn những ngày này ...

Nếu bạn cần chức năng CPython, py4j là một lựa chọn tốt . py4j đã thấy các cập nhật thường xuyên trong năm 2017 và đã trở nên phổ biến vì nó được sử dụng, ví dụ: bởi Apache Spark để đạt được CPython interoperability.

+1

Đó là một lựa chọn thực sự tốt hơn so với Jython, mà là một kết thúc chết công nghệ và dường như không được duy trì nữa. –