2013-01-03 11 views
5

के साथ सी # में एक विशेष पायथन समारोह चलाएं अब तक मेरे पास एक साधारण वर्ग है जो मेरे उपयोग के लिए एक अजगर इंजन (आयरनपीथन) लपेटता है। हालांकि कोड बड़ा दिखता है, यह वास्तव में सरल है इसलिए मैं इसे अपने मुद्दे के साथ और अधिक स्पष्ट करने के लिए यहां कॉपी करता हूं।आयरनपीथन

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 
    } 

} 

इसलिए, यह अच्छा काम करता है, लेकिन यह केवल मुझे एक ही बार में सभी अजगर स्क्रिप्ट को निष्पादित करने की अनुमति देता है ... लेकिन मुझे क्या करना चाहते हैं विशेष कार्यों कॉल करने के लिए सक्षम होने के लिए है:

कोड यह एक पायथो स्क्रिप्ट के भीतर से।

तो, मेरा प्रश्न: मैं लोड की गई स्क्रिप्ट में विशेष फ़ंक्शन कैसे कॉल करूं?

मैं कुछ जानकारी या ट्यूटोरियल ढूंढने की कोशिश कर रहा था लेकिन दुर्भाग्यवश कुछ भी नहीं मिला।

+1

आप http://stackoverflow.com/questions/13231913/how-do-i-call-a-specific पर ध्यान दिया है -method-from-a-python-script-in-c और http://stackoverflow.com/questions/7053172/how-can-i-call-ironpython-code-from-ac-sharp-app? –

+0

@ सिमॉन पहले हां, दूसरा नंबर। लिंक के लिए धन्यवाद, मैं इसे अभी पढ़ूंगा। – NewProger

उत्तर

8

टिप्पणियों में सुझाव देने के लिए धन्यवाद, मैं इसका उपयोग कैसे कर सकता हूं इसका पता लगाने में सक्षम था। यहाँ मैं अब है:

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

} 

यह परीक्षण करने के लिए:

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