将java对象传递给python

时间:2015-05-12 09:05:56

标签: java python jython

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

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

   //getters, setters
 }

3 个答案:

答案 0 :(得分:6)

一种解决方案。您可以使用某种类型的消息系统,队列或某种代理来序列化/反序列化,或者在python和java之间传递消息。然后创建一些sort worker / producer / consumer来将工作放在要在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的好处。

请参阅:

更全面的队列列表:

参考资源:

答案 1 :(得分:0)

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

在某些环境(例如Microsoft Windows)中,OLE(dot-Net)等技术可能可用于允许环境链接在一起"积极,"各种系统实现并提供OLE对象的位置。但是,我不知道是否,也不知道如何做到这一点。

因此,最安全的做法是将它们视为"记录,"并在双方使用序列化技术。 (或者,如果你非常冒险,可以在孩子的线程中运行(比如说)Java。)"冒险"设计可以很快得到控制,投资回报很少。

答案 2 :(得分:0)

您需要使用py2exe将python文件设为exe,请参阅链接:https://www.youtube.com/watch?v=kyoGfnLm4LA。然后在java中使用该程序并传递参数:

请参阅此链接,它将获得详细信息:

Calling fortran90 exe program from java is not executing