Seite 1 von 1

Python & Java (aber ohne Jython)

Verfasst: Mittwoch 30. April 2008, 23:24
von fuppes
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.

Verfasst: Donnerstag 1. Mai 2008, 07:38
von BlackJack
In dem Fall würde ich die Kommunikation zwischen Java und Python über XML-RPC abwickeln.

Verfasst: Donnerstag 1. Mai 2008, 08:44
von sma
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

Verfasst: Donnerstag 1. Mai 2008, 09:27
von Leonidas
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.

Verfasst: Donnerstag 1. Mai 2008, 19:09
von fuppes
super, danke für die antworten, dann mach ich mal an die arbeit.