Как вызвать функцию IronPython из C # / F #? - PullRequest
0 голосов
/ 14 июня 2010

Это своего рода последующие вопросы Интеграция C #, F #, IronPython и IronRuby

Чтобы использовать функцию C / C ++ из Python, 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 #?

  • Как вызвать функцию C # / F # из IronPython?Или есть ли какой-нибудь SWIG-эквивалентный инструмент в IronPython / C #?
  • Как вызвать функцию IronPython из C # / F #?Я думаю, я мог бы использовать «engine.CreateScriptSourceFromString» или аналогичный, но мне нужно найти способ вызова функции IronPython, похожей на функцию C # / F #, не для записи кода в строку, а для чтения из файла.

Ответы [ 4 ]

5 голосов
/ 14 июня 2010

Вы говорите «сейчас пишете код в строке, но читаете из файла», так что, хорошо, прочитайте файл.

Python из F #:

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

F # от Python:

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

Я только что получил их по ссылкам в этом вопросе. Не пробовал это, но, вроде бы, это просто, я думаю, что это «просто работает». Не знаю, что еще вы просите.

3 голосов
/ 26 июня 2010

Может быть, это может помочь: F # и Железный Питон ?

2 голосов
/ 14 июня 2010

Я прочитал некоторые ответы на ваш предыдущий вопрос.Одна статья, на которую ссылается Кевин, отвечает на ваш вопрос.Это было на Руби, так что, возможно, вы не читали это.Я не знаю много о DLR, но я думаю, что его цель - сделать доступ единообразным, поэтому тот же код должен работать с Python.

В любом случае, http://www.highoncoding.com/Articles/573_First_Look_at_the_IronRuby.aspx дает пример .NET 4.0в C #, который использует dynamic, чтобы сделать взаимодействие очень простым.Зеркальное отражение примера C, который вы привели, и последующее из кода Брайана:

//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 # так просто.(Хотя я бы на самом деле не хотел dynamic в F #, потому что код F # выдает гораздо более статичный вид.)

1 голос
/ 29 августа 2013
    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);
...