Problemas de importação de módulos de terceiros ao hospedar o Ironpython em SL
-
05-07-2019 - |
Pergunta
Estou hospedando Python em um aplicativo SL. Basicamente, tenho uma propriedade anexada que permite passar pelo script Python, que é executado no evento de foco perdido do elemento.
A integração do IPY funciona bem, desde que eu não precise de nenhuma importação de terceiros. Eu copiei o pacote de formancode para a pasta Site-Packages em Arquivos de Programas Iron Python ... e depois tentei importar o FormEncode ambos programaticamente usando o scriptEngine.importModule e o Inline. Em cada caso, o módulo não é encontrado.
Meu código de configuração para o host DLR é o seguinte:
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");
Qualquer ajuda seria apreciada.
Solução
O código de hospedagem DLR que você tem parece bom, mas onde você coloca o FormEncode está errado:
Eu copiei o pacote de formancode para a pasta de pacotes de sites em Arquivos de Programas Iron Python
a setup.HostType = typeof(BrowserScriptHost)
A linha faz com que o IronPython procure no arquivo XAP para todas as operações do sistema de arquivo, incluindo "importação". Você precisará copiar o FormEncode.py no projeto Silverlight do seu host e verifique se "Copy Local" está definido como "True", para que chegue ao XAP. Em seguida, importá -lo funcionará.
Isso é esperado porque o Silverlight não pode ler em qualquer local no sistema de arquivos do seu sistema operacional, pois precisa funcionar na máquina de todos :)
Outras dicas
Não tentei fazer exatamente isso, mas achei isso para incluir as assembléias de terceiros (mecanismo de física do Farseer no meu caso), tive que incluir a assembléia no XAP e fazer referência ao app.Manifest.
Mas o que realmente me pegou foi que eu tinha que fazer referência à assembléia com seu nome forte (o que eu só tinha que fazer no SL, localmente, eu poderia usar o nome da montagem).
Espero que isso ajude e eu esteja interessado em ver como você acaba resolvendo.