2013-01-03 12 views
5

Finora ho una semplice classe che include un motore Python (IronPython) per il mio uso. Anche se il codice sembra grande, è molto semplice, quindi lo copio qui per essere più chiaro con il mio problema.Esegui una particolare funzione Python in C# con IronPython

Ecco il codice:

public class PythonInstance 
{ 
    ScriptEngine engine; 
    ScriptScope scope; 
    ScriptSource source; 

    public PythonInstance() 
    { 
     engine = Python.CreateEngine(); 
     scope = engine.CreateScope(); 
    } 

    public void LoadCode(string code) 
    { 
     source = engine.CreateScriptSourceFromString(code, Microsoft.Scripting.SourceCodeKind.Statements); 
     source.Compile(); 
    } 

    public void SetVariable(string key, dynamic variable) 
    { 
     scope.SetVariable(key, variable); 
    } 

    public void RunCode() 
    { 
     source.Execute(scope); 
    } 

    public void CallFunction(string function) 
    { 
     //?????? no idea what to call here 
    } 

} 

Così, funziona benissimo ma permette solo a me di eseguire tutte script python in una volta ... ma quello che vorrei fare è quello di essere in grado di chiamare funzioni particolari dall'interno di una scrittura di pythos.

Quindi, la mia domanda: Come si chiama la funzione particolare nello script caricato?

Stavo cercando di trovare alcune informazioni o tutorial ma purtroppo non ho trovato nulla.

+1

Hai guardato http://stackoverflow.com/questions/13231913/how-do-i-call-a-specific -metodo-da-a-python-script-in-c e http://stackoverflow.com/questions/7053172/how-can-i-call-ironpython-code-from-ac-sharp-app? –

+0

@Simon primo si, secondo no. Grazie per il link, lo leggerò ora. – NewProger

risposta

8

Grazie al suggerimento nei commenti sono stato in grado di capire come usarlo. Ecco quello che ho adesso:

public class PythonInstance 
{ 
    private ScriptEngine engine; 
    private ScriptScope scope; 
    private ScriptSource source; 
    private CompiledCode compiled; 
    private object pythonClass; 

    public PythonInstance(string code, string className = "PyClass") 
    { 
     //creating engine and stuff 
     engine = Python.CreateEngine(); 
     scope = engine.CreateScope(); 

     //loading and compiling code 
     source = engine.CreateScriptSourceFromString(code, Microsoft.Scripting.SourceCodeKind.Statements); 
     compiled = source.Compile(); 

     //now executing this code (the code should contain a class) 
     compiled.Execute(scope); 

     //now creating an object that could be used to access the stuff inside a python script 
     pythonClass = engine.Operations.Invoke(scope.GetVariable(className)); 
    } 

    public void SetVariable(string variable, dynamic value) 
    { 
     scope.SetVariable(variable, value); 
    } 

    public dynamic GetVariable(string variable) 
    { 
     return scope.GetVariable(variable); 
    } 

    public void CallMethod(string method, params dynamic[] arguments) 
    { 
     engine.Operations.InvokeMember(pythonClass, method, arguments); 
    } 

    public dynamic CallFunction(string method, params dynamic[] arguments) 
    { 
     return engine.Operations.InvokeMember(pythonClass, method, arguments); 
    } 

} 

Per provarlo:

 PythonInstance py = new PythonInstance(@" 
class PyClass: 
    def __init__(self): 
     pass 

    def somemethod(self): 
     print 'in some method' 

    def isodd(self, n): 
     return 1 == n % 2 
"); 
     py.CallMethod("somemethod"); 
     Console.WriteLine(py.CallFunction("isodd", 6)); 
Problemi correlati