Python & Java (aber ohne Jython)

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
fuppes
User
Beiträge: 28
Registriert: Dienstag 15. April 2008, 22:33

Hi,

ich wollte mal fragen wie das mit Java und Python nun so richtig funktioniert. Wenn ich das richtig verstanden habe gibts Jython welches mir erlaubt auf fast alle klassen von java zuzugreifen und vererbung zwischen Python und Java zu ermöglichen. Das ist bestimmt auch ne feine sache, aber was ist wenn man "nur" python aus Java ausrufen möchte und dabei ein paar parameter übergeben möchte und dann vielleicht noch ne Rückmeldung von python (Fehlermeldung / Status/...) erhalten will. Also alles mit Vererbung / zugriff aus klassen von Java und so weglassen möchte. Muss man dann trotzdem auf Jython zurückgreifen? Ihc meine das könnte man bestimmt auch mit Web Services lösen, is nur die frage ob das nun viel besser ist.
BlackJack

In dem Fall würde ich die Kommunikation zwischen Java und Python über XML-RPC abwickeln.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Um ein anderes Programm aufzurufen, gibt es in Java `Runtime#exec()`. In welcher Sprache das geschrieben ist, ist egal. Hier ist ein Beispiel:

Code: Alles auswählen

public static void main(String[] args) throws IOException, InterruptedException {
  Process p = Runtime.getRuntime().exec("/usr/bin/python /tmp/a.py arg");
  PrintWriter w = new PrintWriter(p.getOutputStream());
  try {
    w.println("input");
  } finally {
    w.close();
  }
  Reader r = new InputStreamReader(p.getInputStream());
  String result;
  try {
    result = readAll(r);
  } finally {
    r.close();
  }
  int status = p.waitFor();
        
  System.out.println("Status = " + status);
  System.out.println("Result = " + result);
}
    
private static String readAll(Reader r) throws IOException {
  StringBuilder sb = new StringBuilder(4096);
  char[] buf = new char[1024];
  int len = r.read(buf);
  while (len != -1) {
    sb.append(buf, 0, len);
    len = r.read(buf);
  }
  r.close();
  return sb.toString();
}
Das Python-Programm `/tmp/a.py` kann das Argument "arg" über `sys.argv` einlesen, kann die Eingabe `input` aus "stdin" lesen und über "stdout" (etwa per print) etwas an das Java-Programm zurückgeben. Es kann außerdem `sys.exit()` benutzen, um den Status zu setzen.

Stefan
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Außerdem könnte man sich auch JPype ansehen. Das scheint konzeptuell so etwas zu sein was du suchst, allerdings bin ich nicht sicher, ob das nicht schon tot ist.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
fuppes
User
Beiträge: 28
Registriert: Dienstag 15. April 2008, 22:33

super, danke für die antworten, dann mach ich mal an die arbeit.
Antworten