将java对象传递给python

问题描述 投票:0回答:4

我正在为我们的应用程序设计一个接口原型,以允许其他人使用 python,我们的应用程序是用 java 编写的。 我想将一些数据从 java 应用程序传递到 python 代码,但我不确定如何将对象传递给 python。 我使用 Jython 使用简单参数完成了一个简单的 java->python 函数调用,发现它对于我想做的事情非常有用。给定下面的类,我如何在 Python/Jython 中使用它作为函数/类的输入:

public class TestObject 
{
   private double[] values;
   private int length;
   private int anotherVariable;

   //getters, setters
 }
java python jython
4个回答
6
投票

一种解决方案。您可以使用某种消息系统、队列或某种代理来序列化/反序列化,或在 python 和 java 之间传递消息。然后创建一些排序工作人员/生产者/消费者,将工作放入要在 python 或 java 中处理的队列中。

还可以考虑查看灵感:https://www.py4j.org/

py4j 被 pyspark 和 hadoop 类型的东西大量使用。

更及时地回答您的问题。

使用 json-simple.:

的示例
import org.apache.commons.io.FileUtils;
import org.json.simple.JSONObject;
 //import org.json.simple.JSONObject;
  

public class TestObject 
{
   private double[] values;
   private int length;
   private int anotherVariable;
   private boolean someBool;
   private String someString;

   //getters, setters

   public String toJSON() {
       JSONObject obj=new JSONObject();
       obj.put("values",new Double(this.values));
       obj.put("length",new Integer(this.length));
       obj.put("bool_val",new Boolean(this.SomeBool));
       obj.put("string_key",this.someString);
       StringWriter out = new StringWriter();
       obj.writeJSONString(out);
       return out.toString();
   }

   public void writeObject(){
          Writer writer = new BufferedWriter(
                              new OutputStreamWriter(
                                  new FileOutputStream("anObject.json"), "utf-8")
                              )
                           )

          writer.write(this.toJSON());
   }

   public static void setObject(){
       values = 100.134;
       length = 12;
       anotherVariable = 15;
       someString = "spam";
   }
 }

在Python中:

class DoStuffWithObject(object):
    def __init__(self,obj):
        self.obj = obj
        self.changeObj()
        self.writeObj()

    def changeObj(self):
        self.obj['values'] = 100.134;
        self.obj['length'] = 12;
        self.obj['anotherVariable'] = 15;
        self.obj['someString'] = "spam";

    def writeObj(self):
        ''' write back to file '''
        with open('anObject.json', 'w') as f:
            json.dump(self.obj, f)

    def someOtherMethod(self, s):
       ''' do something else '''
       print('hello {}'.format(s))

import json
with open('anObject.json','r') as f:
    obj = json.loads(f.read())
# print out obj['values'] obj['someBool'] ...
for key in obj:
    print(key, obj[key])

aThing = DoStuffWithObject(obj)
aThing.someOtherMethod('there')

然后在java中读回对象。有一些解决方案可以实现这个想法(JSON-RPC、XML-RPC 和变体)。根据情况,您可能还想考虑使用类似的东西(http://docs.mongodb.org/ecosystem/drivers/java/),好处是 mongo 可以处理 json。

参见:

更全面的队列列表:

参考资源:


0
投票

同意下面的答案。 我认为底线是“Python 和 Java 是独立的解释器环境”。 因此,您不应期望将“一个对象”从一个对象转移到另一个对象。 您不应该期望“调用方法。”,但是通过某种中间数据格式(例如 JSON)对其进行序列化和反序列化,将数据从一个传递到另一个是合理的,就像您所做的那样任何其他程序。

在某些环境中,例如 Microsoft Windows,OLE (dot-Net) 等技术可能可用于允许环境“主动”链接在一起,其中各种系统实现并提供 OLE 对象。 但对于是否可以做到这一点以及如何做到这一点,我没有任何个人经验。

因此,最安全的做法是将它们视为“记录”,并在两侧使用序列化技术。 (或者,如果您非常喜欢冒险,可以在子线程中运行(比如说)Java。)“冒险”的设计可能很快就会失控,投资回报率很低。


0
投票
您需要使用 py2exe 将 python 文件制作为 exe,请参阅链接:

https://www.youtube.com/watch?v=kyoGfnLm4LA。然后在java中使用该程序并传递参数:

请参阅此链接,其中包含详细信息:

从java调用fortran90 exe程序没有执行


0
投票
如果您从 Java 的

PythonInterpreter 类调用 Jython 解释器,请使用 PythonInterpreter.set(String, Object) 方法

Foo foo = new Foo(); // Some java object PythonInterpreter pi = new PythonInterpreter(); //pi.exec("import sys; sys.path.append('"+ssmPyDir+"');"); pi.set("foo", foo); // 'foo' will now appear in global namespace of pi
Jython/PythonInterpreter 在自动转换/解释 java 对象方面做得很好。  在解释器中运行的 Python 代码中,您可以:

print("I am: "+foo.name) # Print a field in the Foo object foo.ping(1, 2) # Call the ping method of Foo
Python 环境的上下文保留在 PythonInterpreter (pi) 对象中,因此“pi”中的变量“set”在多个 java 调用之间仍然存在:“result = pi.eval("foo.cntr += 1") ;'    或者:'pi.exec("foo.cntr = 0");'

© www.soinside.com 2019 - 2024. All rights reserved.