Implementierung von Teilprogrammen [Java|Python]

Feeder

Bekanntes Mitglied
Hey,

ich habe in Java ein kleineres Spiel programmiert und möchte nun darin ein paar mathematische Features wie Splines und Bezierkurven implmentieren. Da Java für diese Zwecke mehr als ungeignet ist (ich werde gerne eines besseren belehrt), grief ich auf Python 3 zurück.

Num möchte ich, das Java einen Pythonprozess startet,ein beliebig großes Array aus Arrays mit 2 Zahlen hineingibt und wartet bis es eine Antwort in Form eines Arrays mit 4 Zahlen zurückbekommt.

Wichtig ist vielleicht ist, das ich eine Möglichkeit suche, den Pythoncode in eine .exe umzuwandeln.

Ich suche für beide Sprachen einen geeigneten Code.
Ich kenne mich noch nicht gut mit solchen Sachen aus:

Vermutlich muss ich einen Outputstream eröffnen, die Arrays übergeben, und den Pythonprozess vorher starten um auf diese Inputs "hören" zu können. Dann muss Python einen Outputstream eröffnen und Java [zeitgleich im selben Thread der GameLoop, alles andere wird Müll]
die Ergebnisse abwarten.

Allerdings habe ich keine Ahnung wie das nun konkret aussehen soll. Zudem weiß ich nicht wie die Kommunikation zwischen zwei Sprachen funktioniert. Wie müssen Daten weitergegeben werden? Welche Konventionen gibt es?

Mit freundlichen Grüßen
Suchty
 
Zuletzt bearbeitet:
Hey,

danke für deine Antwort!
das wäre sicherlich eine Lösung aber gefallen tut sie mir nicht,da ich nicht jeden Zeilenumbruch einfügen will...
Ich würde schon gerne eine fertige .py öffnen bzw starten wollen...

Code:
def spline(o):
    splines = []
    f=[0,0,0,0]
    for i in range(0,len(o)-1,1):
        x1 = o[i][0]
        x2 = o[i+1][0]
        y1 = o[i][1]
        y2 = o[i + 1][1]

        a = [[x1**3,x1**2,x1,1],
             [x2**3,x2**2,x2,1],
             [3*x1**2,2*x1,1,0],
             [3*x2**2,2*x1,1,0]]
        b = [y1,y2,3*f[0]*x1**2+2*f[1]*x1+f[2],0]
        f = np.linalg.solve(a,b)
        splines.append(f)
    return splines
 
Zuletzt bearbeitet:
Kannst du ja auch.
In dem Beispiel wird es nur so gemacht, dass die python-Datei erst erstellt wird und dann ausgeführt wird.
Wenn es deine Datei bereits gibt kannst du den ersten Schritt einfach weglassen.

Oder verstehe ich dich gerade falsch?
 
Hey,

ja , die Möglichkeit ist mir auch gerade klar geworden.
Ich würde aber gerne Array weitergeben und das kann ich mir gerade nicht so Recht vorstellen...

Wäre das dann:

Java:
Process p = Runtime.getRuntime().exec("python test1.py "+arrayname);

Quellcode, siehe oben...

Und wie lese ich denn dann so ein Array aus?
 
Die einzige Möglichkeit die mir einfallen würde wäre die einzelnen Elemente des Arrays zu übergeben und im python-Programm selbst dann wieder zu einem Array zu machen.
Mittels Jython gäbe es da bestimmt noch mehr Möglichkeiten .. müsstest du dich mal zu einlesen.
 
Also das muss doch ohne weiteres machbar sein:

Java,Python
Programm öffnen;
OutputStream öffnen, Inputstream öffnen;
Outpur übergeben, Auf Input warten;
Inputstream öffnen,Input verarbeiten
Input warten, Outputstream öffnen und übergeben

...

Ich weiß halt bloß nicht wie 😀
 
Also was gehen würde (über die Process-Klasse) wäre sowas:

Python-Code:
PHP:
import argparse
parser = argparse.ArgumentParser(description="Process some integers.")
parser.add_argument('integers', metavar='N', type=int, nargs='+', help='Some integers..')

args = parser.parse_args()
def f(x) : return x*2

value = list(map(f, args.integers))
print(value)

Java-Code
Java:
public static void main( String[] args ) throws IOException {
    final String pathToPythonProgramm = "path/to/programm.py";
    final int[][] data = { { 1, 2 }, { 3, 4 }, { 5, 6 } };

    String numberString = Arrays.deepToString(data).replaceAll("\\[|,|]", "");
    Process p = Runtime.getRuntime().exec(String.format("python %s %s", pathToPythonProgramm, numberString));

    BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream()));

    String s = "";
    while ( ( s = stdInput.readLine() ) != null ) {
        System.out.println(s);
    }
}
Der Output davon wäre [2, 4, 6, 8, 10, 12]. Daraus könntest du dir ja theoretisch wieder dein Array zusammen basteln.
Das ist sicherlich nicht der schönste Weg den es gibt.. Vielleicht fällt ja anderen noch was besseres ein.
 

Zurück
Oben