我搜索过StackOverflow,但没有找到解决我问题的方法。 我正在使用Iron Python 2.7.3 DLR Hosting API。 我要做的是从C#代码调用纯python脚本的python函数。我从here中取了示例,这个简单的代码就像一个魅力。 但我的用例稍微复杂一点,在我的python模块中,我正在进行非标准软件包和模块的导入。
MyModule.py
import sys
sys.path.append(r"C:\Program Files (x86)\IronPython 2.7")
sys.path.append(r"C:\Program Files (x86)\IronPython 2.7\Lib")
sys.path.append(r"C:\Program Files (x86)\IronPython 2.7\Lib\lib2to3")
import os
import clr
sys.path.append(r'C:\MyPythonCodeLocation')
# mypackage are located at C:\MyPythonCodeLocation
import mypackage
def foo(p):
print '{0}: module - {1}, package - {2}'.format(p,__name__,__package__);
然后我从c#这样调用foo函数
var pyRuntime = Python.CreateRuntime();
ScriptEngine pyEng = pyRuntime.GetEngine("python");
ScriptSource source = pyEng.CreateScriptSourceFromFile("MyModule.py");
ScriptScope scope = pyEng.CreateScope();
source.Execute(scope);
Func<int, bool> f = bis.GetVariable<Func<int, bool>>("foo");
f(1);
但是Source.Execute(scope);
会抛出异常 - ValueError:在非包中尝试相对导入 。
如果我从脚本中删除import mypackage
,一切都会顺利进行。当然在python控制台中,这个脚本运行正常,所有导入都正确解析。
还有一件事要提一下,我的Visual Studio项目位于C:\ users \ Me \ MyDocuments ...... \ PythonDLRTest,当然还有从那里运行。导入如脚本所示的包,我猜测我面临的问题是与这些路径有关的问题。
可能有人可以解释我做错了什么以及如何解决这个导入问题。理解python和ironpython之间的低级差异以及为什么导入分辨率应该不同,这将是非常有趣的。