Проблемы с импортом сторонних модулей при размещении IronPython в SL
-
05-07-2019 - |
Вопрос
Я размещаю Python в SL-приложении. По сути, у меня есть вложенное свойство, которое позволяет вам передавать скрипт Python, который затем выполняется при событии потерянного фокуса элемента.
Интеграция с МПГ работает нормально, пока мне не нужен импорт третьей стороны. Я скопировал пакет formencode в папку site-packages в папке Program Files \ Iron Python ... и затем попытался импортировать formencode программно, используя ScriptEngine.ImportModule и inline. В каждом случае модуль не найден.
Мой установочный код для хоста DLR следующий:
var setup = new ScriptRuntimeSetup();
setup.HostType = typeof(BrowserScriptHost);
setup.LanguageSetups.Add(Python.CreateLanguageSetup(null));
setup.Options["SearchPaths"] = new string[] { string.Empty };
_runtime = new ScriptRuntime(setup);
_engine = _runtime.GetEngine("Python");
_scope = _engine.CreateScope();
_engine.ImportModule("formencode");
Любая помощь будет оценена.
Решение
Код хостинга DLR, который у вас есть, выглядит хорошо, но неправильный код formencode:
Я скопировал пакет formencode в папку site-packages в папке Program Files \ Iron Python
строка setup.HostType = typeof (BrowserScriptHost)
заставляет IronPython искать в файле XAP все операции файловой системы, включая " импорт " ;. Вам нужно будет скопировать файл formencode.py в проект Silverlight вашего хоста и убедиться, что " Копировать локально " установлено на "True" так что это делает его путь в XAP. Тогда импорт будет работать.
Это ожидается, потому что Silverlight не может читать из любого места в файловой системе вашей операционной системы, так как он должен работать на каждом компьютере:)
Другие советы
Я не пытался сделать именно это, но я обнаружил, что для включения сторонних сборок (в моем случае это физический движок дальновидности) мне пришлось включить сборку в XAP и сослаться на нее в App.manifest. р>
Но что меня поразило, так это то, что мне пришлось ссылаться на сборку с ее строгим именем (что я должен был делать только в SL, локально я мог просто использовать имя сборки).
Надеюсь, это поможет, и мне будет интересно посмотреть, как вы в итоге решите это.