【发布时间】:2016-05-02 12:36:05
【问题描述】:
当 IronPython 试图解析/加载一个它找不到的模块时,有没有办法从 IronPython 中捕获某种东西?
我们希望将模块存储在数据库中或将它们嵌入到 DLL 中并通过调用 import mymodule 来导入它们。我们根本不想涉及文件系统。当我们说import something 时,我们不希望它在\Lib 或任何文件系统中查找。
以下代码可以很好地加载嵌入在 DLL 中的 Python 块。它仅在没有导入时才有效。
var myScript = new StreamReader(Assembly.GetAssembly(this.GetType()).GetManifestResourceStream("Resource.Name.To.My.Script")).ReadToEnd()
var engine = IronPython.Hosting.Python.CreateEngine();
var scope = engine.CreateScope();
var result = engine.Execute(myScript, scope);
还有python代码:
print('hello world')
如果有导入,事情就不起作用了。它不知道如何解析模块的位置。
我可以让它工作的唯一方法是确保我们需要的任何模块在文件系统中对引擎都是可见的。这涉及使用 engine.GetSearchPaths() (查看它正在寻找的路径)和使用 engine.SetSearchPaths() 附加任何其他搜索路径。但这些来自文件系统,这不是我想要的。
我想一个不错的方法可能是从引擎接收某种事件,例如“OnLookingForModuleNamedXYZ(moduleName)”。然后我可以在数据库或 DLL 的嵌入式资源中查找该模块,并将该模块的字符串发回。
我该怎么做?
【问题讨论】:
-
试试
import sys如果可行,那么看看stackoverflow.com/questions/3144089/…
标签: python ironpython