代码之家  ›  专栏  ›  技术社区  ›  prosseek

如何从C/F调用Ironpython函数?

  •  0
  • prosseek  · 技术社区  · 14 年前

    这是一种后续问题 Integration of C#, F#, IronPython and IronRuby

    为了从Python中使用C/C++功能,SWIG是最简单的解决方案。 相反的方法也可以用python c-api实现,例如,如果我们有如下的python函数

    def add(x,y):
        return (x + 10*y)
    

    我们可以在C中使用包装器来使用这个Python,如下所示。

    double Add(double a, double b)
    {
        PyObject *X, *Y, *pValue, *pArgs;
        double res;
    
        pArgs = PyTuple_New(2);
        X = Py_BuildValue("d", a);
        Y = Py_BuildValue("d", b);
    
        PyTuple_SetItem(pArgs, 0, X);
        PyTuple_SetItem(pArgs, 1, Y);
        pValue = PyEval_CallObject(pFunc, pArgs);
        res = PyFloat_AsDouble(pValue);    
    
        Py_DECREF(X);
        Py_DECREF(Y);
        Py_DECREF(pArgs);
        return res;
    }
    

    Ironpython/C甚至F怎么样?

    • 如何从Ironpython调用c/f函数?或者,在Ironpython/c中是否有类似swig的工具?
    • 如何从c/f调用Ironpython函数?我想我可以使用“engine.createScriptSourceFromString”或类似的方法,但我需要找到一种方法来调用Ironpython函数,它看起来像c/f函数,而不是将代码写入字符串,而是从文件中读取。
    4 回复  |  直到 11 年前
        1
  •  5
  •   Brian    14 年前

    你说“现在把代码写在一个字符串中,但是从一个文件中读取”,那么好吧,读取这个文件。

    从Fy:

    let s = File.ReadAllLines("foo.py")
    let engine = Python.CreateEngine()
    let scriptSource = 
        engine.CreateScriptSourceFromString(s, SourceCodeKind.Statements)
    ...
    

    Python中的f*

    import clr   
    clr.AddReferenceToFile("SomeFsLib.dll") 
    

    我刚从这个问题的链接中得到这些。没有尝试过,但是,就像,很简单,我认为它“只是起作用”。不知道你还想要什么。

        2
  •  3
  •   desco    14 年前

    也许这可以帮助: F# and Iron Python ?

        3
  •  2
  •   Nathan Shively-Sanders    14 年前

    我读了你以前问题的一些答案。凯文链接的一篇文章回答了你的问题。它是红宝石的,所以也许你没读过。我对DLR不太了解,但我认为它的目的是使访问统一,所以同一代码应该与Python一起使用。

    不管怎样, http://www.highoncoding.com/Articles/573_First_Look_at_the_IronRuby.aspx 给出一个.NET 4.0的C示例,它使用 dynamic 使互操作变得非常简单。镜像您给出的C示例,然后从Brian的代码开始:

    //Brian's code goes here, but C#-ified with `var` instead of `let`
    engine.Execute();
    object personClass = engine.Runtime.Globals.GetVariable("Person");
    dynamic person = engine.Operations.CreateInstance(personClass);
    person.greet();
    

    这是基于Ruby代码:

    class Person
      def greet()
        puts 'hello world'
      end
    end
    

    我认为可以以完全相同的方式访问等效的python。我不知道你可以用DLR来做这个,直到我读了你以前问题的文章。很令人兴奋的是,C中的互操作如此简单。(尽管我真的不想 动态 在f中,因为f代码会产生更静态的感觉。)

        4
  •  1
  •   Milind Morey    11 年前
        pyEngine = Python.CreateEngine();
                        pyScope = pyEngine.CreateScope();
                        var instance = pyEngine.Execute(@" 
                        def test(a,b): 
                        return a+b 
                        ", pyScope);
    
                        var test = pyScope.GetVariable<Func<int,int, int>>("test");
                        int s = test(2,3);
                        MessageBox.Show( Convert.ToString( test));
                        var ops = pyEngine.CreateOperations(pyScope);