Bạn có thể gọi tập lệnh python từ java 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

  • JDK - Jep sử dụng JNI để thực thi mã Python, vì vậy chạy ứng dụng của bạn với JRE sẽ không đủ vì nó không bao gồm mô-đun JNI cần thiết

  • Python - cả Python 2. x và 3. x được hỗ trợ

  • Cài đặt thư viện Jep Python, chỉ cần chạy

pip install jep
  • Cài đặt thư viện Jep Java. Ví dụ: trong trường hợp bạn đang sử dụng gradle, hãy thêm phần phụ thuộc sau vào bản dựng của bạn. phân lớp

implementation group: 'black.ninia', name: 'jep', version: '3.9.1'
  • Cuối cùng, bạn sẽ cần đưa vào ứng dụng Java của mình một đối số JVM mới trỏ đến thư mục cài đặt thư viện Jep Python của bạn, chẳng hạn

-Djava.library.path=/Users//Library/Python/3.9/lib/python/site-packages/jep


Bắt đầu

Bâ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ẽ

  1. Chèn 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 giá trị của biến tên mã Java của chúng tôi

  2. Thực thi mã Python bằng phương thức exec[]

  3. Nhận giá trị trả về từ Python trở lại Java

Đó 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ản

Trườ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 đổi

Mọ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 đó

Ở đây tôi trình bày ba tùy chọn khác nhau để chạy các chương trình Python từ Java; . ]

cách tiếp cận thời gian chạy

Đầu tiên, hãy lấy một cái gì đó theo cách cũ để làm điều đó, lớp Runtime

  1. nhập java. io. *;
  2. lớp kiểm tra1{
  3. public static void main[String a[]]{
  4. cố gắng{
  5. Chuỗi prg = "nhập sys\nprint int[sys. argv[1]]+int[sys. argv[2]]\n";
  6. BufferedWriter ra = new BufferedWriter[new FileWriter["test1. py"]];
  7. ngoài. viết [prg];
  8. ngoài. đóng lại[];
  9. int số1 = 10;
  10. int số2 = 32;
  11. Quy trình p = Thời gian chạy. getRuntime[]. exec["trăn test1. py "+số1+" "+số2];
  12. BufferedReader in = new BufferedReader[new InputStreamReader[p. getInputStream[]]];
  13. int ret = new Integer[trong. readLine[]]. intValue[];
  14. Hệ thống. ngoài. println["giá trị là. "+ret];
  15. }bắt[Ngoại lệ e]{}
  16. }
  17. }

Chúng tôi bắt đầu bằng cách tạo một prg Chuỗi Java, chứa chương trình Python của chúng tôi, chuỗi này được lưu vào tệp "test1. py". Tiếp theo, chúng tôi chạy trình thông dịch Python trên hệ thống của mình, với phương thức exec trong lớp Thời gian chạy. Chúng tôi đọc đầu ra từ luồng đầu ra được trả về từ lớp Thời gian chạy và chuyển đổi đầu ra này thành Java int

Tôi đã lưu mã nguồn ở trên là "test2. Java". tôi đã gõ như sau;

thử nghiệm javac2. java

Để thực hiện nó

thử nghiệm java2

phương pháp tiếp cận quá trình

Tôi nghĩ rằng cách tiếp cận lớp Runtime hơi cũ. Trong phiên bản Java mới nhất, phiên bản được sử dụng là lớp ProcessBuilder. Điều này mang lại nhiều cấu trúc hơn cho các đối số

  1. nhập java. io. *;
  2. lớp bài kiểm tra2{
  3. public static void main[String a[]]{
  4. cố gắng{
  5. Chuỗi prg = "nhập sys\nprint int[sys. argv[1]]+int[sys. argv[2]]\n";
  6. BufferedWriter ra = new BufferedWriter[new FileWriter["test1. py"]];
  7. ngoài. viết [prg];
  8. ngoài. đóng lại[];
  9. int số1 = 10;
  10. int số2 = 32;
  11. ProcessBuilder pb = new ProcessBuilder["python","test1. py",""+số1,""+số2];
  12. Quá trình p = pb. bắt đầu[];
  13. BufferedReader in = new BufferedReader[new InputStreamReader[p. getInputStream[]]];
  14. int ret = new Integer[trong. readLine[]]. intValue[];
  15. Hệ thống. ngoài. println["giá trị là. "+ret];
  16. }catch[Ngoại lệ e]{Hệ thống. ngoài. println[e];}
  17. }
  18. }

Tôi đã lưu ở trên là "test2. Java". Sau đó, tôi gõ như sau;

thử nghiệm javac2. java

Để thực hiện nó

thử nghiệm java2

cách tiếp cận Jython

Java được cho là độc lập với nền tảng và để gọi một ứng dụng gốc [như python] không độc lập với nền tảng

Có một phiên bản Python [Jython] được viết bằng Java, cho phép chúng tôi nhúng Python vào các chương trình Java của mình. Thông thường, khi bạn định sử dụng các thư viện bên ngoài, một trở ngại là biên dịch và chạy nó một cách chính xác, do đó, chúng tôi sẽ thực hiện quá trình xây dựng và chạy một chương trình Java đơn giản với Jython

Chúng tôi bắt đầu bằng cách giữ tệp jython jar

http. //www. jython. tổ chức/tải xuống. html

[Khi tôi viết bài này, phiên bản mới nhất là. Jython 2. 5. 3]

Tôi đã sao chép jython-2. 5. 3. jar vào thư mục chứa chương trình Java của tôi. Sau đó, tôi gõ chương trình sau, chương trình này thực hiện giống như hai chương trình trước;

  1. nhập tổ chức. con trăn. sử dụng. Phiên dịch Python;
  2. nhập tổ chức. con trăn. cốt lõi. *;
  3. lớp bài kiểm tra3{
  4. public static void main[String a[]]{
  5. PythonInterpreter python = new PythonInterpreter[];
  6. int số1 = 10;
  7. int số2 = 32;
  8. con trăn. set["number1", new PyInteger[number1]];
  9. con trăn. set["number2", new PyInteger[number2]];
  10. con trăn. exec["số3 = số1+số2"];
  11. PyObject số3 = python. get["số 3"];
  12. Hệ thống. ngoài. println["val. "+số 3. toString[]];
  13. }
  14. }

Tôi gọi tập tin này là "test3. java", lưu nó và làm như sau để biên dịch nó

javac-classpath jython-2. 5. 3. bình kiểm tra3. java

Bước tiếp theo là thử chạy nó, tôi làm theo cách sau

java - đường dẫn lớp jython-2. 5. 3. cái lọ. kiểm tra3

Bây giờ, điều này cho phép chúng tôi sử dụng Python từ Java, theo cách độc lập với nền tảng. Nó hơi chậm, trên thực tế, nó giống như cách tiếp cận chậm nhất trong ba cách tiếp cận được trình bày. Tuy nhiên, thật tuyệt khi nó là một trình thông dịch Python được viết bằng Java

15 Jun '13 #1

7

212463

làm cách nào để gọi hàm python bằng một đối số bằng cách sử dụng kỹ thuật thứ nhất hoặc thứ hai trong đó mã python sẽ trả về giá trị chuỗi cho chương trình java?

23 sep '16 #2

Tôi khuyên bạn nên sử dụng lớp ProcessBuilder để triển khai một giải pháp không tầm thường bao gồm giao tiếp

Tạo mã Python một cách nhanh chóng là một ý tưởng hay, nhưng nó có thực sự có giá trị không? . Hoặc, cẩu không hợp lý, vì vấn đề dễ dàng được giải quyết trong Python, nhưng không phải trong C/C++/Java

Đối với giá trị trả về, có một số tùy chọn

  1. Chụp đầu ra được in của chương trình Python
  2. Yêu cầu chương trình Python ghi đầu ra mong muốn vào một tệp được xác định rõ và chỉ cần bỏ qua tất cả các đầu ra khác
  3. Kiểm tra trạng thái trả về quy trình con và hành động phù hợp

Bạn có thể muốn sử dụng trình thông dịch nhúng Python như một phần của trang web thực thi Python do người dùng nhập trong môi trường bị hạn chế. Ví dụ: trang có thể muốn cấm truy cập vào tất cả các lệnh I/O của tệp và giao diện hệ thống

Chúc mừng,
Oralloy.

25 sep '16 #3

cái này hoạt động hoàn hảo với tôi, nhưng tôi đang gặp phải một vấn đề khác, nếu tập lệnh python của tôi đưa ra bất kỳ lỗi nào như lỗi cú pháp, thông báo lỗi không xuất hiện ở đầu ra java của tôi, tôi luôn phải chạy tập lệnh theo cách thủ công và kiểm tra xem có lỗi nào không. Bất kỳ ý tưởng làm thế nào để nắm bắt điều đó là tốt

8 Jun '17 #4

Cảm ơn bạn đã phân loại các phương thức gọi Python khác nhau từ Java. Tôi tự hỏi nếu bạn có một số suy nghĩ về những điều sau đây

1] Nếu bạn sử dụng Runtime hoặc ProcessBuilder, có cách nào để giữ python chạy giữa các lệnh gọi và gửi lệnh mới cho quy trình hiện tại không?

2] Nếu bạn sử dụng Jython, có cách nào tải thư viện C cho python không?

5 Oct '17 #5

không có giải pháp nào trong số này hoạt động

24 Jan '18 #6

Tôi nhận được "Ngoại lệ trong luồng "chính" ImportError. Không thể nhập mô-đun trang web và các phần phụ thuộc của nó. Không có mô-đun có tên trang web"

Làm cách nào để gọi mã Python từ Java?

Bắt đầu .
Chèn 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 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ả về từ Python trở lại Java

Java có thể tương tác với Python không?

Tương tác liền mạch giữa Python và Java cho phép các nhà phát triển tự do kết hợp hai ngôn ngữ cả trong quá trình phát triển và vận chuyển sản phẩm.

Chủ Đề