我有一个等待输入参数的python代码。此输入是另一个java代码的输出。有什么方法可以在两个代码之间传递参数,比如两者之间的桥接?
提前致谢
答案 0 :(得分:3)
执行这些任务的最佳方法是使用RabbitMQ之类的消息代理。它提供对Java,Python,PHP等的支持。您可以在使用不同语言实现的进程之间发送消息(例如,json消息或任何其他格式)。 Here您可以找到使用不同语言实现的教程。
<强> RabitMQ 强> RabbitMQ是一个消息代理。它位于生产者和消费者之间。生产者是生成消息并将这些消息发布到RabbitMQ中的队列的组件。 RabbitMQ接收这些消息,并根据规则定义路由并将这些消息传递给消费者。消费者是等待接收消息和运行任务的任务运行者。这是一个简单的生产者,它连接到RabbitMQ,发送一条消息,然后退出。
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.Channel;
public class Send {
private final static String QUEUE_NAME = "hello";
public static void main(String[] argv) throws java.io.IOException {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
String message = "Hello World!";
channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
System.out.println(" [x] Sent '" + message + "'");
channel.close();
connection.close();
}
}
在这里,我们有一个简单的java消费者,我们让它继续运行以监听消息。你不仅限于java。您可以使用任何有RabbitMQ库的语言(Python,PHP,C#,JavaScript等):
import com.rabbitmq.client.*;
import java.io.IOException;
public class Recv {
private final static String QUEUE_NAME = "hello";
public static void main(String[] argv) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
System.out.println(" [*] Waiting for messages. To exit press CTRL+C");
Consumer consumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body)
throws IOException {
String message = new String(body, "UTF-8");
System.out.println(" [x] Received '" + message + "'");
}
};
channel.basicConsume(QUEUE_NAME, true, consumer);
}
}
运行它:
$ javac -cp rabbitmq-client.jar Send.java Recv.java
$ java -cp .:commons-io-1.2.jar:commons-cli-1.1.jar:rabbitmq-client.jar Send
$ java -cp .:commons-io-1.2.jar:commons-cli-1.1.jar:rabbitmq-client.jar Recv
注意:您需要rabbitmq-client.jar
及其对类路径的依赖。
答案 1 :(得分:1)
这种过程互连有两个主要问题:序列化和传输。
当您将数据从Java进程传递到Python应用程序时,您很可能希望看到特定类型的对象而不是原始字节或文本。有许多框架旨在处理跨语言行为。请查看Apache Avro,Protobuf或Apache Thrift。每个人都有自己的pros and cons。
第二个问题是运输。就像@Mustafa一样,Shujaie已经说过像RabitMQ这样的面向消息的传输是一个不错的选择。另请参阅Java和Python的REST服务。
顺便说一句,如果你采用像Protobuf这样的面向字节的序列化,那么普通的TCP传输可能是一个不错的选择 - 与任何像HTTP这样的应用程序级别的协议相比,数据开销会更加明显。请参阅此文章:python和java。
答案 2 :(得分:0)