将 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.
参见:
- https://spring.io/guides/gs/messaging-reactor/
- http://spring.io/guides/gs/messaging-rabbitmq/
- http://spring.io/guides/gs/scheduling-tasks/
- Celery like Java projects
- Jedis
- RabbitMQ
- ZeroMQ
更全面的队列列表:
引用的资源:
- http://www.oracle.com/technetwork/articles/java/json-1973242.html
- How do I create a file and write to it in Java?
- https://code.google.com/p/json-simple/wiki/EncodingExamples
同意下面的回答。我认为底线是 "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它会有详细信息:
我正在为我们的应用程序设计一个接口原型,以允许其他人使用 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.
参见:
- https://spring.io/guides/gs/messaging-reactor/
- http://spring.io/guides/gs/messaging-rabbitmq/
- http://spring.io/guides/gs/scheduling-tasks/
- Celery like Java projects
- Jedis
- RabbitMQ
- ZeroMQ
更全面的队列列表:
引用的资源:
- http://www.oracle.com/technetwork/articles/java/json-1973242.html
- How do I create a file and write to it in Java?
- https://code.google.com/p/json-simple/wiki/EncodingExamples
同意下面的回答。我认为底线是 "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它会有详细信息: