2013-01-03 7 views
5

Bis jetzt habe ich eine einfache Klasse, die eine Python-Engine (IronPython) für meine Verwendung umschließt. Obwohl Code groß aussieht, ist es wirklich einfach, also kopiere ich es hier, um klarer mit meinem Problem umzugehen.Führen Sie eine bestimmte Python-Funktion in C# mit IronPython

Hier ist der Code:

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 
    } 

} 

Also, es funktioniert gut, aber es erlaubt nur mir auf einmal alle Python-Skript ausführen ... aber was ich möchte, ist zu tun, der Lage sein, bestimmte Funktionen aufzurufen aus einem Pythos-Skript heraus.

Also, meine Frage: Wie rufe ich bestimmte Funktion im geladenen Skript?

Ich habe versucht, einige Informationen oder Tutorials zu finden, aber konnte leider nichts finden.

+1

Haben Sie bei http://stackoverflow.com/questions/13231913/how-do-i-call-a-specific sah -method-from-a-python-script-in-c und http://stackoverflow.com/questions/7053172/how-can-i-call-ironpython-code-from-ac-sharp-app? –

+0

@Simon zuerst ja, zweite nein. Danke für den Link, ich werde es jetzt lesen. – NewProger

Antwort

8

Dank Vorschlag in den Kommentaren konnte ich herausfinden, wie man es benutzt. Hier ist, was ich habe jetzt:

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); 
    } 

} 

es zu testen:

 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)); 
Verwandte Themen