2012-02-21 38 views
8

Tôi đang sử dụng Jython trong một dự án Java.Làm thế nào để gọi một phương thức python từ một lớp java?

tôi có một lớp Java: myJavaClass.java và một Python lớp: myPythonClass.py

public class myJavaClass{ 
    public String myMethod() { 
     PythonInterpreter interpreter = new PythonInterpreter(); 
     //Code to write 
    } 
} 

File Python được như sau:

class myPythonClass: 
    def abc(self): 
     print "calling abc" 
     tmpb = {} 
     tmpb = {'status' : 'SUCCESS'} 
     return tmpb 

Bây giờ vấn đề là tôi muốn gọi phương thức abc() của tệp Python của tôi từ phương thức myMethod của tệp Java của tôi và in kết quả.

+1

What've bạn đã cố gắng? Bạn đã xem xét điều này chưa: http://www.jython.org/archive/21/docs/embedding.html? – grifaton

Trả lời

12

Nếu tôi đọc the docs đúng, bạn chỉ có thể sử dụng eval chức năng:

interpreter.execfile("/path/to/python_file.py"); 
PyDictionary result = interpreter.eval("myPythonClass().abc()"); 

Hoặc nếu bạn muốn để nhận được một chuỗi:

PyObject str = interpreter.eval("repr(myPythonClass().abc())"); 
System.out.println(str.toString()); 

Nếu bạn muốn cung cấp một số đầu vào từ biến Java, bạn có thể sử dụng set trước và và vì sử dụng tên biến trong mã Python của bạn:

interpreter.set("myvariable", Integer(21)); 
PyObject answer = interpreter.eval("'the answer is: %s' % (2*myvariable)"); 
System.out.println(answer.toString()); 
+0

vì vậy tôi cần phải có một dòng mã như: interpreter.eval ("myPythonClass(). Abc (myvariable)"); – Hasti

+0

@ashti: Vâng, điều đó sẽ cung cấp 'myvariable' làm đối số cho phương thức' abc' của lớp bạn. Tôi đã thêm một ví dụ khác để minh họa cách sử dụng biến mới được tạo. –

+0

Cảm ơn bạn rất nhiều vì thông tin hữu ích của bạn. Đã giải quyết được vấn đề! – Hasti

1

Không có cách nào để thực hiện chính xác điều đó (mà tôi biết).

Tuy nhiên bạn có một vài lựa chọn:

1) Thực hiện các python từ bên trong java như thế này:

try { 
    String line; 
    Process p = Runtime.getRuntime().exec("cmd /c dir"); 
    BufferedReader bri = new BufferedReader(new InputStreamReader(p.getInputStream())); 
    BufferedReader bre = new BufferedReader(new InputStreamReader(p.getErrorStream())); 
    while ((line = bri.readLine()) != null) { 
     System.out.println(line); 
    } 
    bri.close(); 
    while ((line = bre.readLine()) != null) { 
     System.out.println(line); 
    } 
    bre.close(); 
    p.waitFor(); 
    System.out.println("Done."); 
} 
catch (Exception err) { 
    err.printStackTrace(); 
} 

2) Bạn có thể có thể sử dụng Jython đó là "một thực hiện các chương trình Python ngôn ngữ viết bằng Java ", từ đó bạn có thể có thêm may mắn làm những gì bạn muốn.

3) Bạn có thể làm cho hai ứng dụng giao tiếp bằng cách nào đó, với một ổ cắm hoặc tập tin chia sẻ

+0

Ông đã sử dụng 'PythonInterpreter', là một [lớp Jython] (http://www.jython.org/javadoc/org/python/util/PythonInterpreter.html). –

+0

Ồ, thẻ * Python * thì khó hiểu. –

+0

Tại sao vậy? Jython * là * một triển khai Python. Tuy nhiên, tôi đã thêm thẻ [jython] vào câu hỏi. –

3

Nếu chúng ta cần phải chạy một hàm python có thông số, và trả về kết quả, chúng ta chỉ cần in này:

import org.python.core.PyObject; 
import org.python.core.PyString; 
import org.python.util.PythonInterpreter; 

public class method { 

public static void main(String[] args) { 

    PythonInterpreter interpreter = new PythonInterpreter(); 
    interpreter.execfile("/pathtoyourmodule/somme_x_y.py"); 
    PyObject str = interpreter.eval("repr(somme(4,5))"); 
    System.out.println(str.toString()); 

} 

Somme là chức năng trong python mô-đun somme_x_y.py

def somme(x,y): 
    return x+y 
0

Bạn có thể download here Jython 2.7.0 - Standalone Jar.

Sau đó ...

  1. thêm video này vào con đường java của bạn trong nhật thực ......
  2. Trong Package Explorer (bên trái), nhấp chuột phải vào dự án Java của bạn và chọn Properties .
  3. Trong thanh xem ảnh ở bên trái, hãy chọn Đường dẫn xây dựng Java.
  4. Chọn tab Thư viện.
  5. Chọn Thêm các JAR bên ngoài ...
  6. Duyệt đến bản cài đặt Jython của bạn (C: \ jython2.5.2 cho tôi) và chọn jython.jar.
  7. Nhấp vào áp dụng và đóng.

Sau đó ...

Java class (main) //use your won package name and python class dir 
----------------- 
package javaToPy; 
import org.python.core.PyObject; 
import org.python.util.PythonInterpreter; 

public class JPmain { 

    @SuppressWarnings("resource") 
    public static void main(String[] args) { 

    PythonInterpreter interpreter = new PythonInterpreter(); 

    //set your python program/class dir here 
    interpreter.execfile 
    ("C:\\Users\\aman0\\Desktop\\ME\\Python\\venv\\PYsum.py"); 

    PyObject str1 = interpreter.eval("repr(sum(10,50))"); 
    System.out.println(str1.toString()); 

    PyObject str2 = interpreter.eval("repr(multi(10,50))"); 
    System.out.println(str2.toString()); 


    interpreter.eval("repr(say())"); 


    interpreter.eval("repr(saySomething('Hello brother'))"); 

} 

} 

--------------------------- 
Python class 
------------ 

def sum(x,y): 
    return x+y 

def multi(a,b): 
    return a*b 

def say(): 
    print("Hello from python") 

def saySomething(word): 
    print(word)`enter code here` 
Các vấn đề liên quan