gpt4 book ai didi

import - 自定义 IronPython 导入解析

转载 作者:行者123 更新时间:2023-12-04 05:09:47 25 4
gpt4 key购买 nike

我正在从数据库加载 IronPython 脚本并执行它。这适用于简单的脚本,但导入是一个问题。如何拦截这些导入调用,然后从数据库中加载适当的脚本?

编辑:我的主应用程序是用 C# 编写的,我想在不编辑 Python 脚本的情况下拦截 C# 端的调用。

编辑:从我所做的研究来看,创建自己的 PlatformAdaptationLayer 似乎是你应该实现的方式,但在这种情况下它不起作用。我已经创建了自己的 PAL,在我的测试中,我的 FileExsists脚本中的每个导入都会调用方法。但由于某种原因,它从不调用 OpenInputFileStream 的任何重载。方法。挖掘 IronPython 源代码,一旦 FileExists 返回 true,它就会尝试在路径上定位文件本身。所以这看起来像一个死胡同。

最佳答案

经过大量的反复试验,我得出了一个解决方案。我从来没有设法得到PlatformAdaptationLayer正确工作的方法。它在尝试加载模块时从未回调 PAL。

所以我决定用如下所示的 SetVariable 方法替换内置的导入函数(Engine 和 Scope 是 protected 成员,暴露了父脚本的 ScriptEngineScriptScope):

delegate object ImportDelegate(CodeContext context, string moduleName, PythonDictionary globals, PythonDictionary locals, PythonTuple tuple);

protected void OverrideImport()
{
ScriptScope scope = IronPython.Hosting.Python.GetBuiltinModule(Engine);
scope.SetVariable("__import__", new ImportDelegate(DoDatabaseImport));
}

protected object DoDatabaseImport(CodeContext context, string moduleName, PythonDictionary globals, PythonDictionary locals, PythonTuple tuple)
{
if (ScriptExistsInDb(moduleName))
{
string rawScript = GetScriptFromDb(moduleName);
ScriptSource source = Engine.CreateScriptSourceFromString(rawScript);
ScriptScope scope = Engine.CreateScope();
Engine.Execute(rawScript, scope);
Microsoft.Scripting.Runtime.Scope ret = Microsoft.Scripting.Hosting.Providers.HostingHelpers.GetScope(scope);
Scope.SetVariable(moduleName, ret);
return ret;
}
else
{ // fall back on the built-in method
return IronPython.Modules.Builtin.__import__(context, moduleName);
}
}

希望这对某人有帮助!

关于import - 自定义 IronPython 导入解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4105804/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com