将参数从Java传递到Python,反之亦然

时间:2016-03-23 15:53:46

标签: java python parameters parameter-passing

我有一个等待输入参数的python代码。此输入是另一个java代码的输出。有什么方法可以在两个代码之间传递参数,比如两者之间的桥接?

提前致谢

3 个答案:

答案 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 AvroProtobufApache Thrift。每个人都有自己的pros and cons

第二个问题是运输。就像@Mustafa一样,Shujaie已经说过像RabitMQ这样的面向消息的传输是一个不错的选择。另请参阅JavaPython的REST服务。

顺便说一句,如果你采用像Protobuf这样的面向字节的序列化,那么普通的TCP传输可能是一个不错的选择 - 与任何像HTTP这样的应用程序级别的协议相比,数据开销会更加明显。请参阅此文章:pythonjava

答案 2 :(得分:0)

如果您在单个设备上部署了这两个程序,则可以考虑使用支持处理进程间通信(IPC)的库,例如ZeroMQ

它具有以下两者的绑定:

我已成功在嵌入式系统上使用ARM处理器与0MQ进行通信。它可以作为用多种语言编写的程序之间的通信总线(在我的例子中主要是C和Python)。

在进行原型设计时,您可以使用人类可读的数据格式(如JSON)。有很多库支持(de)使用Java序列化JSON(如GSON)。 Python有本机模块。