Выполнение скриптов IronPython из кода C #

У меня один вопрос, у меня такой код

this._engine = Python.CreateEngine();
ScriptSource source = this._engine.CreateScriptSourceFromString(script.SourceCode);
ScriptScope scope = this._engine.CreateScope();
ObjectOperations operations = this._engine.Operations;
source.Execute(scope);

И я пытаюсь выполнить код IronPython из учебника:

from System.Collections import BitArray
ba = BitArray(5)
ba.Set(0, True) # call the Set method
print ba[0]

Значит, он выполняется правильно, но я не могу понять, print ba[0] у меня ли, почему он не выводит это значение на консоль? Кстати, не могли бы вы посоветовать несколько хороших статей об использовании IronPython для написания сценариев приложений?

И еще один вопрос: если у меня есть какой-то класс Python, и я не знаю имени этого класса, потому что клиент может определить его вручную, возможно ли создать экземпляр этого класса? Например

class SomeClass(object):
    def some(self, a, b):
        return <something>

Теперь я пытаюсь использовать этот код

dynamic SomeClass = scope.GetVariable("SomeClass");
dynamic something = SomeClass();
something.some(x,y);

Следует ли мне перебирать ScriptScope.GetItems() коллекцию и искать PythonType объектов?


person Jevgenij Nekrasov    schedule 29.09.2010    source источник


Ответы (1)


Думаю нужно просто позвонить:

this._engine.Runtime.IO.RedirectToConsole();

В противном случае посмотрите здесь по аналогичному вопросу о перенаправлении.

Что касается создания экземпляра класса python на C #, ваш код кажется в порядке, как показано в этом вопрос (посмотрите на третий ответ)

РЕДАКТИРОВАТЬ:

Извините, я недостаточно внимательно прочитал ваш вопрос ...

В любом случае, чтобы найти доступные классы в Python, просто сделайте, как вы сказали,

то есть что-то вроде:

var availDynClasses = items.Where(x => x.Value is IronPython.Runtime.Types.PythonType);
person digEmAll    schedule 29.09.2010
comment
Хорошо спасибо! Я не очень разбираюсь в создании экземпляров, он работает нормально, когда я точно знаю, что такое имя класса. Но если клиенты определяют свой собственный класс с каким-то настраиваемым именем, которое реализует некоторый интерфейс (например, с одним методом Do ()), и я хочу создать экземпляр этого класса и запустить этот метод Do (), но я не могу использовать 'scope .GetVariable () ', потому что я не знаю имени класса. - person Jevgenij Nekrasov; 29.09.2010