2016-03-23 74 views
2

我有一個等待輸入參數的python代碼。這個輸入是另一個java代碼的輸出。有什麼辦法可以通過兩個代碼之間的參數,比如兩者之間的橋樑嗎?將參數從Java傳遞到Python,反之亦然

在此先感謝

+0

so ...你的代碼在哪裏? – haifzhan

+0

你可以把Java程序的輸出寫到標準輸出和從標準輸入讀取的python程序中。或者只是使用TCP套接字。 – Schore

+0

使用tcp ip通信,將java定義爲服務器,將python定義爲客戶端...連接它們並傳輸數據 –

回答

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和依賴於類路徑。

+0

雖然這個鏈接可能回答這個問題,但最好在這裏包含答案的重要部分,並提供供參考的鏈接。如果鏈接頁面更改,則僅鏈接答案可能會失效。 - [來自評論](/ review/low-quality-posts/11747108) – RoadieRich

+0

@RoadieRich謝謝,我更新了我的問題 –

+0

我認爲你的生產者和消費者的原始問題是相反的。 – RoadieRich

1

這種工藝互連有兩個主要問題:序列化和傳輸。

將數據從Java進程傳遞到Python應用程序時,很可能希望看到特定類型的對象而不是原始字節或文本。有許多框架旨在處理跨語言行爲。看看Apache AvroProtobufApache Thrift。每個人都有自己的pros and cons

第二個問題是運輸。像@Mustafa Shujaie已經說過,像RabitMQ這樣的面向消息的傳輸是一個不錯的選擇。但也可以看看JavaPython的REST服務。順便說一句,如果你採用像Protobuf這樣的面向字節的序列化,那麼普通的TCP傳輸可能是一個不錯的選擇 - 與任何像HTTP這樣的應用程序級協議相比,數據開銷將顯着受歡迎。看到這篇文章:pythonjava

0

如果您已經在單個設備上部署了這兩個程序,則可以考慮使用支持處理進程間通信(IPC)的庫,例如ZeroMQ

它綁定兩個:

我已經成功地應用於通信0MQ嵌入式系統與ARM處理器。它可以作爲用多種語言編寫的程序之間的通信總線(在我的案例中主要是C和Python)。

雖然原型可以使用人類可讀的數據格式(如JSON)。有很多庫支持(de)序列化Java中的JSON(如GSON)。 Python有這個原生模塊。

相關問題