将 java 对象传递给 python

Passing java object to python

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

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

   //getters, setters
 }

一个解决方案。您可以使用某种消息系统、队列或某种代理来 serialize/deserialize,或在 python 和 java 之间传递消息。然后创建某种排序 workers/producer/consumers 以在 python 或 java.

中处理要处理的队列

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

py4j 被大量使用 by/for 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.

参见:

更全面的队列列表:

引用的资源:

同意下面的回答。我认为底线是 "Python and Java are separate interpreter-environments." 因此您不应该期望将 "an object" 从一个转移到另一个。您不应该期望 "call methods." 但是通过某种中间数据格式 对其进行序列化和反序列化,将 数据 从一个数据传递到另一个数据是合理的(例如 JSON)就像你对任何其他程序所做的那样。

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

因此,最安全的做法是将它们视为"records,",并在两侧使用序列化技术。 (或者,如果您非常喜欢冒险,可以在子线程中使用 运行(例如)Java。)"adventurous" 设计可能很快就会失控,几乎没有 return投资。

您需要使用 py2exe 将 python 文件制作成 exe,参考 link : https://www.youtube.com/watch?v=kyoGfnLm4LA。然后使用java中的程序并传递参数:

请参考这个link它会有详细信息: