# Python-Code mit Java ausführen



## smierx (27. Mai 2018)

Moin,
ich glaube ich bin zwar im falschen Forum, weiß aber auch nicht so recht wo es besser hinpasst.

Also ich habe ein ziemlich großes Programm mit dem Raspberry Pi in arbeit und mein "Hauptprogramm" ist in Java geschrieben aber für viele Sensoren(eigentlich alle) ist es sehr umständlich diese in Java zu schreiben, im Gegensatz zu Python. 

Ich möchte also Python Code in mein Java Programm einbinden. Meine Frage nun wie mache ich das am besten? 

Also Ideal fände ich es eine eigene Java Bibliothek zu schreiben in der in Modulen/Files der Python Code ebenfalls vorhanden ist und sich aufrufen lässt.

Hat jemand Ideen für mich?

Mit freundlichen Grüßen

Smierx


----------



## Java20134 (27. Mai 2018)

Das könnte dir weiterhelfen: https://stackoverflow.com/questions/8898765/calling-python-in-java


----------



## smierx (27. Mai 2018)

Etwas hat es mir weitergeholfen. Ich habe die jython Bibliothek in mein Projekt importiert. 

```
import Adafruit_DHT

sensor = Adafruit_DHT.DHT22

humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)
```
Ist mein Python Code.

Ich will mit einer Java Klasse nun diesem Code die Variable pin übergeben und die Lutfeuchtigkeit/Temperatur erhalten


----------



## smierx (28. Mai 2018)

Bitte kann mir wer helfen?
Das ist das letzte was mir zur fertigstellung des Programmes fehlt!


----------



## mrBrown (28. Mai 2018)

MMn in dem Fall am einfachsten: das Python-Programm ganz normal (natürlich aus Java heraus) ausführen und mit diesem über Argumente/STDIN und STOUT kommunizieren.

In Java kannst du dafür ProcessBuilder nutzen, in Python einfach ganz normale ein/ausgabe


----------



## smierx (28. Mai 2018)

Funktioniert das auch wenn ich dem Python Programm eine Variable übergeben muss/möchte?


----------



## mrBrown (28. Mai 2018)

Ja, entweder eben über STDIN oder als Argument beim Start oder über Umgebungsvariablen


----------



## tommysenf (28. Mai 2018)

```
public class Scripting {
  public static void main(String[] args) {
    ScriptEngineManager mgr = new ScriptEngineManager();
    ScriptEngine engine = mgr.getEngineByName("python");

    int pin = 4;
    engine.put("pin", list1);
    String code =
      "import Adafruit_DHT\n"
      + "sensor = Adafruit_DHT.DHT22\n"
      + "humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)\n";
    try {
      engine.eval(code);
      System.out.println(engine.get("humidity"));
      System.out.println(engine.get("temperature"));
    }
    catch (ScriptException se) {
      se.printStackTrace();
    }
  }
}
```


----------



## smierx (28. Mai 2018)

Danke @tommysenf 
wo kommt list1 weg? also wenn ich den code kopiere fehlt die Variable
und beim ausführen der Methode(habe den code etwas umgeschrieben) bekomme ich etliche fehlermeldungen

```
public void Scripting() {
    ScriptEngineManager mgr = new ScriptEngineManager();
    ScriptEngine engine = mgr.getEngineByName("python");
    String abc = null;
    int pin = 4;
    engine.put("pin", abc);
    String code =
      "import Adafruit_DHT\n"
      + "sensor = Adafruit_DHT.DHT22\n"
      + "humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)\n";
    try {
      engine.eval(code);
      System.out.println(engine.get("humidity"));
      System.out.println(engine.get("temperature"));
    }
    catch (ScriptException se) {
      se.printStackTrace();
    }
  }
```
@mrBrown Also das mit Input Stream funktioniert, wenn im python file die Variable angegeben ist.
Aber mir etwas die Methoden von Inputstream angeguckt aber komme nicht drauf wie ich dem file eine Variable übergeben kann wenn diese nicht in dem Python file initialisiert ist?


----------



## tommysenf (28. Mai 2018)

tommysenf hat gesagt.:


> *int* pin = 4;
> engine.put("pin", list1);


hier sollte eigentlich:

```
int pin = 4;
engine.put("pin", pin);
```
stehen...​


----------



## smierx (28. Mai 2018)

@tommysenf Dann spuckt er mir nur noch ImportError:No module Named Adafruit aus
muss ich das Modul evtl wo anders abspeichern als in meinem /home/pi wenn ich es so wie oben benutzen will?


----------



## tommysenf (28. Mai 2018)

Es muss sich natürlich im Python Module Pfad befinden.
https://docs.python.org/3/tutorial/modules.html#the-module-search-path


----------



## smierx (29. Mai 2018)

@mrBrown kannste mir damit noch helfen?


----------



## mrBrown (29. Mai 2018)

smierx hat gesagt.:


> @mrBrown Also das mit Input Stream funktioniert, wenn im python file die Variable angegeben ist.
> Aber mir etwas die Methoden von Inputstream angeguckt aber komme nicht drauf wie ich dem file eine Variable übergeben kann wenn diese nicht in dem Python file initialisiert ist?


In Java kannst du von einem *Input*Stream nur lesen, das ist normal.
Du kannst aber dem Python-Skript beim Start Argumente übergeben (https://www.tutorialspoint.com/python/python_command_line_arguments.htm) oder einen OutputStream öffnen, und diesen aus Java füllen und in Python als Standardeingabe lesen.


----------

