2016-03-23 4 views
2

Ich habe einen Python-Code, der auf Eingabeparameter wartet. Diese Eingabe ist die Ausgabe eines anderen Java-Codes. Gibt es eine Möglichkeit, die Parameter zwischen den beiden Codes wie eine Brücke zwischen den beiden zu übergeben?Parameter von Java nach Python übergeben und umgekehrt

Vielen Dank im Voraus

+0

so ... wo ist dein Code? – haifzhan

+0

Sie könnten die Ausgabe des Java-Programms auf stdout schreiben und im Python-Programm von stdin lesen. Oder benutze einfach TCP-Sockets. – Schore

+0

Verwenden Sie eine TCP IP-Kommunikation, definieren Sie die Java als Server und die Python als Client ... verbinden sie und übertragen Daten –

Antwort

3

Der beste Weg, diese Art von Aufgaben zu tun ist, einen Nachrichten-Broker wie RabbitMQ zu verwenden. Es bietet Unterstützung für Java, Python, PHP usw. Sie können Nachrichten (z. B. eine json-Nachricht oder in einem anderen Format) zwischen Prozessen senden, die mit verschiedenen Sprachen implementiert wurden. Here können Sie Tutorials finden, die in verschiedenen Sprachen implementiert sind.

RabitMQ RabbitMQ ist ein Nachrichten-Broker. Es sitzt zwischen Produzenten und Konsumenten. Hersteller sind Komponenten, die Nachrichten produzieren und diese Nachrichten in einer Warteschlange in RabbitMQ veröffentlichen. RabbitMQ nimmt diese Nachrichten und nach den Regeln, die Sie definiert haben, Routen und liefert diese Nachrichten an die Verbraucher. Verbraucher sind Aufgabenläufer, die darauf warten, Nachrichten zu empfangen und Aufgaben auszuführen. Hier ist ein einfacher Produzent, der sich mit RabbitMQ verbindet, eine einzelne Nachricht sendet und beendet.

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(); 
    } 
} 

Und hier haben wir eine einfache Java-Verbraucher, die wir halten es läuft für Nachrichten abzuhören. Sie sind nicht auf Java beschränkt. Sie können eine beliebige Sprache benutzen, die es RabbitMQ Bibliotheken für (Python, PHP, C#, JavaScript, etc.):

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); 
    } 
} 

es auszuführen:

$ 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 

Hinweis: Sie rabbitmq-client.jar benötigen und ihre Abhängigkeiten vom Klassenpfad.

+0

Während dieser Link die Frage beantworten kann, ist es besser, die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz bereitzustellen. Nur-Link-Antworten können ungültig werden, wenn sich die verknüpfte Seite ändert. - [Aus Bewertung] (/ review/low-quality-posts/11747108) – RoadieRich

+0

@RoadieRich Danke, ich habe meine Frage aktualisiert –

+0

Ich denke, Sie haben den Hersteller und Verbraucher umgekehrt von dem, was die ursprüngliche Frage ist. – RoadieRich

1

Diese Art der Prozessverbindung hat zwei Hauptprobleme: Serialisierung und Transport.

Wenn Sie Daten vom Java-Prozess an Python-Anwendung übergeben, möchten Sie höchstwahrscheinlich ein Objekt eines bestimmten Typs anstelle von Raw-Bytes oder Text sehen. Es gibt eine Reihe von Frameworks, die für das sprachübergreifende Verhalten entwickelt wurden. Werfen Sie einen Blick auf Apache Avro, Protobuf oder Apache Thrift. Jeder hat seinen eigenen pros and cons.

Das zweite Problem ist der Transport. Wie @Mustafa Shujaie bereits sagte Message-orientierten Transport wie RabitMQ ist eine gute Wahl. Sehen Sie sich aber auch die REST-Dienste für Java und Python an.

Übrigens, wenn Sie Byte-orientierte Serialisierung wie Protobuf nehmen, dann könnte der einfache TCP-Transport eine gute Wahl sein - der Daten-Overhead wäre im Vergleich zu jedem Anwendungsebenen-Protokoll wie HTTP erheblich besser. Siehe diese Artikel: python und java.

0

Wenn Sie beide Programme auf einem einzelnen Gerät bereitgestellt haben, können Sie Bibliotheken verwenden, die die Verarbeitung der Interprozesskommunikation (IPC) unterstützen, z. B. ZeroMQ.

Es hat Bindungen für beide:

ich erfolgreich die Kommunikation mit 0MQ auf Embedded-System mit ARM-Prozessoren angewendet haben. Es ist ein Kommunikationsbus zwischen Programmen, die in mehreren Sprachen geschrieben sind (in meinem Fall meistens in C und Python).

Während des Prototyping können Sie ein menschenlesbares Datenformat (wie JSON) verwenden. Es gab eine Menge Bibliotheken, die JSONs in Java serialisieren (wie GSON). Python hat native Module dafür.