Jython Integrationsproblem

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.
aldana
User
Beiträge: 12
Registriert: Donnerstag 20. April 2006, 16:29

Samstag 10. Juni 2006, 11:55

hi,

ich hab mit python/jython einen Ant task (Java build tool) geschrieben.

(Java->Jython) integration geschieht ja mit der "@sig ..." anweisung.
allerdings funktioniert da was nicht:

siehe code:

Code: Alles auswählen

import org.apache....
 
class HibernateTask(Task):
 
    def execute(self):
        "@sig public void execute()"
        print "task started"
HibernateTask kann ich instanziieren (klasse wird also gefunden) allerdings wird die methode execute nicht erkannt (siehe client code):

public Main{
public static void main(String[] args){
HibernateTask ht=new HibernateTask(); //ist okay
ht.execute(); //compile error name unresolved
}
}


meine compilierungsanweisungen:

$ jythonc.bat -a -d -c -j task.jar HibernateTask.py
$ javac -classpath 'task.jar;.' Main.java

ich verwende jython 2.1 auf java 1.4.2_12.
Zuletzt geändert von aldana am Sonntag 11. Juni 2006, 12:13, insgesamt 1-mal geändert.
murph
User
Beiträge: 622
Registriert: Freitag 14. April 2006, 19:23
Kontaktdaten:

Samstag 10. Juni 2006, 12:01

ich habe zwar keine ahnung von java, aber ich sehe keine methode execute()
(wenn ich 'methode' von meinen pythonkenntnissen her definiere)
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Samstag 10. Juni 2006, 16:34

murph hat geschrieben:ich sehe keine methode execute()
Hi murph!

Häää???? Was ist denn bei dir eine Methode, wenn **execute()** keine für dich ist?

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Samstag 10. Juni 2006, 16:47

Hi aldana!

Ich habe da mal in meinem gescheiden Büchlein "Exploring Python" nachgesehen, da ich persönlich Jython nicht einsetze. Ich fasse es mal in Stichwörtern zusammen. Und was sich nicht zusammenfassen lässt schreibe ich einfach mal so ab.

- jythonic ist für die Umwandlung zuständig

- Um den Anforderungen von jythonic zu genügen, erbt Mittler zudem von java.lang.Object

Hier das Beispiel aus dem Buch:

Code: Alles auswählen

import java

class Mittler(java.lang.Object):
    def __init__(self):
        self.summe = 0.0
        self.anzahl = 0

    def hinzufuegen(self, m):
        """@sig public void hinzufuegen(int m)"""
        self.summe += m
        self.anzahl += 1

    def arithMittel(self):
        """@sig public float arithMittel()"""
        if self.anzahl:
            return self.summe / self.anzahl
        else:
            raise ZeroDivisionError, "Keine Daten"
Mit folgendem Kommando erzeugt jythonic aus der Python-Datei eine Jar-Datei Mittler.jar, welche die kompilierte Python-Klasse Mittler.py in einem Java-Paket beispiel.mittler enthält:

Code: Alles auswählen

jythonic --package beispiel.mittler --jar Mittler.jar   Mittler.py
Hier das Java-Beispiel:

Code: Alles auswählen

import beispiel.mittler.Mittler;
import java.util.Random;

public class PyCompiled {
    public static void main(String[] args) {
        Mittler m = new Mittler();
        Random rnd = new Random();

        for (int i=0; i < 17; i++) {
            m.hinzufuegen(1+Math.abs(rnd.nextInt())%17);
        }
        System.out.println("Mittel: " + m.arithMittel());
    }
}
Vielleicht kannst du damit etwas anfangen.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Samstag 10. Juni 2006, 16:51

Und hier noch ein interessanter Link: http://www.jython.org/Project/userguide ... va-classes

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
murph
User
Beiträge: 622
Registriert: Freitag 14. April 2006, 19:23
Kontaktdaten:

Samstag 10. Juni 2006, 21:01

@gerold:
wo ist da im code denn ht.execute() definiert?
oder ist das unter java die anweisung, die klase auszuführen?
außerdem kann man das schlecht lesen, bin persönlich sehbehindert (trage brille) und habe mühe, das zu lesen!
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Samstag 10. Juni 2006, 22:17

murph hat geschrieben:@gerold:
wo ist da im code denn ht.execute() definiert?
oder ist das unter java die anweisung, die klase auszuführen?
außerdem kann man das schlecht lesen, bin persönlich sehbehindert (trage brille) und habe mühe, das zu lesen!
Hi murph!

Eine Methode ist, grob gesagt, eine Funktion, die in einer Klasse definiert wurde.

Code: Alles auswählen

class HibernateTask(Task): # Das ist die Klassendefinition
 
    def execute(self): # Das ist die Methodendefinition
        "@sig public void execute()"
        print "task started" 
In diesem Code wird eine Klasse mit der **Methode** **execute** definiert.

Code: Alles auswählen

public Main{
    public static void main(String[] args){
        HibernateTask ht=new HibernateTask(); //ist okay
        ht.execute(); //compile error name unresolved
    }
}
Hier wird der Variable *ht* eine neue Instanz der Klasse *HibernateTask* zugewiesen. Der Code **ht.execute()** führt also die Methode **execute()** der Klasseninstanz *ht* aus.

Fazit: Es wurde eine Methode definiert und es wurde eine Methode ausgeführt. Ich sehe also die Methode. Warum du sie nicht siehst, weiß ich nicht.

Trotzdem lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
murph
User
Beiträge: 622
Registriert: Freitag 14. April 2006, 19:23
Kontaktdaten:

Samstag 10. Juni 2006, 22:44

ich bin in der vorzeile ins schleudern geraten.
also klassen und methoden sind mir ein begriff, nur der javacode und das "hinundhergezeige" haben mich dazu verleitet, zu denken, dass die methode fehlt, dachte, sie müsste im javacode stehen, aber da ist ja grade die aufgabe, das außeinanderzubringen.
public static void main(String[] args){
HibernateTask ht=new HibernateTask(); //ist okay
da oben ist mein problem.
in einer klasse wird eine öffentliche statische methode main definiert, die *string/array* und beliebige ardgumente benötigt. Ihr Inhalt ist ?????
An der Stelle glaub ich dir einfach mal, dass das, was du sagtest, da steht.
für mich ist das gedankliche wortkotze ohne jegliche erkennbare syntax, aber das ist mir jetzt egal. wenn ich zeit und lust habe, werde ich mir sonst nochma java ankucken.[/code]
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Sonntag 11. Juni 2006, 07:28

murph hat geschrieben:für mich ist das gedankliche wortkotze ohne jegliche erkennbare syntax
Hi murph!

Dann musst du dich zurück halten und auf solche Fragen nicht antworten.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
murph
User
Beiträge: 622
Registriert: Freitag 14. April 2006, 19:23
Kontaktdaten:

Sonntag 11. Juni 2006, 11:39

alles klar
aldana
User
Beiträge: 12
Registriert: Donnerstag 20. April 2006, 16:29

Sonntag 11. Juni 2006, 12:12

danke für die antworten/links, aber leider keine da, die mir weiter hilft :D

die frage ist immer noch, warum execute() nicht als klassenmethode erkannt wird? ich hab doch eigentlich alles für eine entsprechende python/java integration korrekt gemacht, oder?

danke.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Sonntag 11. Juni 2006, 12:51

aldana hat geschrieben:ich hab doch eigentlich alles für eine entsprechende python/java integration korrekt gemacht, oder?
Hi aldana!

- Erbt deine Klasse von "java.lang.Object" --> Nein.
- Verwendest du **jythonic** um das Ganze zu kompilieren --> Nein.

Weitere Fragen?

mfg
Gerold
:-)

PS: Ich habe keine Ahnung von dem was ich da schreibe. Ich vermute aber, dass die Autoren des Buches, das ich zitiert habe, etwas davon verstehen. Wenn die schreiben, dass die Klasse von "java.lang.Object" abgeleitet werden muss, dass diese den Ansprüchen von jythonic gerecht wird, dann glaube ich das.
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
aldana
User
Beiträge: 12
Registriert: Donnerstag 20. April 2006, 16:29

Sonntag 11. Juni 2006, 13:15

1) in Java erben ALLE klassen von Object. Task erbt von Object, also ist HibernateTask indirekt ebenfalls von Object abgeleitet
2) jythonic kenn ich nicht. es gibt aber jythonc, welches ich natürlich verwendet habe (siehe meine kommandozeile-anweisungen).

jythonc scheint auch "teilweise" funktionieren, da ich ja HibernateTask (siehe main Java methode) instanziieren kann.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Sonntag 11. Juni 2006, 13:56

aldana hat geschrieben:1) in Java erben ALLE klassen von Object. Task erbt von Object, also ist HibernateTask indirekt ebenfalls von Object abgeleitet
2) jythonic kenn ich nicht. es gibt aber jythonc, welches ich natürlich verwendet habe (siehe meine kommandozeile-anweisungen).
Hi aldana!

Oh, da habe ich wohl "jytonc" falsch geschrieben. Aber "jyton.c" war auch nicht gerade richtig. ;-)

Funktioniert das von mir oben aufgeführten Beispiel, wenn du es mit dem richtigen Dateinamen (jythonc) kompilierst? Genauso wie ich es aufgezeigt habe, mit den angegebenen Parametern?

Wenn ja, dann wäre das schon einmal ein guter Schritt nach vorne. Dann bräuchte man nur noch ausprobieren, ob es am Kompilieren oder an der Vererbung liegt.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
aldana
User
Beiträge: 12
Registriert: Donnerstag 20. April 2006, 16:29

Sonntag 11. Juni 2006, 20:00

hier ein einfaches beispiel (noch einfacher gehts nicht), das nicht funktioniert. diesmal Vererbung direkt von Object:

Source HibernateTask.py:

Code: Alles auswählen

class HibernateTask(Object):
        
    def execute(self):
        "@sig public void execute()"
        print 'hi'
der java client:

Code: Alles auswählen

public class Main{

     public static void main(String[] args){
          System.out.println("start");
          HibernateTask ht=new HibernateTask();
          ht.execute();
     }

}

danach:

packen nach jar.
$ jythonc.bat -a -d -c -j task.jar HibernateTask.py

kompilieren des Clients (Main.java)
$ javac -classpath 'task.jar;.' Main.java

dennoch nichts zu machen, execute wird nicht erkannt :(.
Antworten