Мы используем IronPython в нашем проекте с открытым исходным кодом. У меня проблема экранная переменная, добавленные в области скрипта, какДоступные переменные области сценария из модулей
private ScriptScope CreateScope(IDictionary<string, object> globals)
{
globals.Add("starting", true);
globals.Add("stopping", false);
var scope = Engine.CreateScope(globals);
scope.ImportModule("math");
return scope;
}
можно использовать глобал от основного сценария, но любой модуль, который загружен не будет выполнено. Как это можно исправить?
обновление: Учитывая этот модуль mymodule.py
if starting: #starting is defined on the scope
...
Из основного сценария выполняется с помощью этого кода
void RunLoop(string script, ScriptScope scope)
{
ExecuteSafe(() =>
{
var compiled = Engine.CreateScriptSourceFromString(script).Compile();
while (!stopRequested)
{
usedPlugins.ForEach(p => p.DoBeforeNextExecute());
CatchThreadAbortedException(() => compiled.Execute(scope));
scope.SetVariable("starting", false);
threadTimingFactory.Get().Wait();
}
scope.SetVariable("stopping", true);
CatchThreadAbortedException(() => compiled.Execute(scope));
});
}
from mymodule import * #this will load the moduel and it fails with
редактировать: В ответ на @ ответ BendEg в
Я попытался это
scope.SetVariable("__import__", new Func<CodeContext, string, PythonDictionary, PythonDictionary, PythonTuple, object>(ResolveImport));
ImportDelegate
не определено так пробовали использовать Func вместо этого, метод ResolveImport никогда не срабатывает и я получаю такое же исключением того, что имя не определено
редактирования: Я изменил создание возможности для
var scope = Engine.GetBuiltinModule();
globals.ForEach(g => scope.SetVariable(g.Key, g.Value));
Теперь делегат импорта запускает, но он сбой в первой строке с global name 'mouse' is not defined
, мышь не используется из модуля. Кажется, что это смущает, когда я добавляю свои пользовательские глобальные переменные в BuiltinModule
Не могли бы вы предоставить более полный пример (например, что выполняется против этой области и как она терпит неудачу)? –
См. Править – Anders