【问题标题】:Passing parameter from Java to Python and vise versa [closed]将参数从Java传递到Python,反之亦然[关闭]
【发布时间】:2016-03-23 15:53:46
【问题描述】:

我有一个等待输入参数的 python 代码。此输入是另一个 java 代码的输出。有没有什么办法可以在两个代码之间传递参数,就像两者之间的桥梁一样?

提前致谢

【问题讨论】:

  • 那么...你的代码呢?
  • 您可以将 Java 程序的输出写入标准输出,并在 python 程序中从标准输入读取。或者只使用 TCP 套接字。
  • 使用 tcp ip 通信,定义 java 为服务器,python 为客户端...连接它们并传输数据
  • 写入文件并不成功,因为我有很多线程写入同一个文件,所以我会尝试 TCP 通信.. 非常感谢大家

标签: java python parameters parameter-passing


【解决方案1】:

完成此类任务的最佳方法是使用像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 及其对类路径的依赖项。

【讨论】:

  • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review
  • @RoadieRich 谢谢,我更新了我的问题
  • 我认为您的生产者和消费者与最初的问题相反。
【解决方案2】:

这种进程互连有两个主要问题:序列化和传输。

当您将数据从 Java 进程传递到 Python 应用程序时,您很可能希望看到特定类型的对象,而不是原始字节或文本。有许多框架旨在处理跨语言行为。看看Apache AvroProtobufApache Thrift。每个人都有自己的pros and cons

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

顺便说一句,如果您采用像 Protobuf 这样的面向字节的序列化,那么纯 TCP 传输可能是一个不错的选择 - 与任何应用程序级协议(如 HTTP)相比,数据开销将大大增加。请参阅这篇文章:pythonjava

【讨论】:

    【解决方案3】:

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

    它对两者都有绑定:

    我已经成功地在带有 ARM 处理器的嵌入式系统上应用了与 0MQ 的通信。它充当用多种语言编写的程序之间的通信总线(在我的例子中主要是 C 和 Python)。

    在制作原型时,您可以使用人类可读的数据格式(如 JSON)。有很多库支持(反)序列化 Java 中的 JSON(如 GSON)。 Python为此提供了本机模块。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-22
      • 2023-03-21
      • 2018-06-20
      • 2010-12-27
      • 2020-10-18
      • 2013-11-25
      相关资源
      最近更新 更多