2016-02-18 8 views
5

Sto cercando di creare e lanciare un oggetto in Jython e sto ricevendo il seguente errore:Jython - Eccezione Fusioni Class con PyObject

Exception in thread "MainThread" java.lang.ClassCastException: org.python.core.PySingleton cannot be cast to resources.ixia.IxNetType 
at resources.ixia.IxNetFactory.create(IxNetFactory.java:34) 
at resources.ixia.IxiaTest.run(IxiaTest.java:34) 
at resources.ixia.IxiaTest.<init>(IxiaTest.java:14) 
at resources.ixia.IxiaTest.main(IxiaTest.java:42) 

Ecco il codice:

import org.python.core.PyObject; 
import org.python.util.PythonInterpreter; 

public class IxNetFactory { 

    private PyObject ixNetClass; 
    private PythonInterpreter interpreter; 

    public IxNetFactory(String script_dir) { 
     script_dir=script_dir.replace("\\", "/"); 

     interpreter = new PythonInterpreter(); 

     interpreter.exec("import sys");    
     interpreter.exec("sys.path.append('"+script_dir+"')"); 
     interpreter.exec("import time"); 
     interpreter.exec("import os"); 
     interpreter.exec("from ixnetworks import IxNet"); 
     //interpreter.exec("from utils import sm"); 
     //interpreter.exec("from utils import cpf"); 

     ixNetClass = interpreter.get("IxNet"); 
    } 

    /* 
    * Create an IxNet object 
    * 
    * Usage: ixNet.create(); 
    */ 
    public IxNetType create() { 
     PyObject ixNetObject = ixNetClass.__call__(); 
     return (IxNetType)ixNetObject.__tojava__(IxNetType.class); 
    } 

    public void close() { 
     interpreter.close(); 
    } 
} 

Per la vita da me non riesco a capire cosa sto facendo male. Da tutte le cose che ho letto, mi sembra di farlo correttamente ma non riesco a farlo funzionare.

Se qualcuno con esperienza con Jython potrebbe dirmi che cosa sto facendo male sarebbe molto apprezzato.

+1

I mi chiedo come siano "IxNet" e "IxNetType". Se la fonte di questi tipi è chiusa, è possibile riscriverli in modo tale da ridurre al minimo la loro esposizione ma riprodurre ancora il problema? –

risposta

0

Questa è una risposta molto tarda, ma per altre persone che potrebbero trovarsi di fronte allo stesso problema: ho appena avuto quello che ritengo essere lo stesso errore e l'ho risolto. Sto indovinando che la dichiarazione della tua classe Python non eredita dalla tua interfaccia.

Per esempio, ixnet.py:

import IxNetType 

class IxNet(IxNetType): 
... 

Questo è ciò che si dovrebbe avere. Al contrario, è probabilmente solo dichiarato IxNet come:

class IxNet: 
... 

che produrrà l'errore: "java.lang.ClassCastException: org.python.core.PySingleton non può essere gettato a resources.ixia.IxNetType"