2

我搜索了 StackOverflow,但没有找到解决我的问题的方法。我正在使用 Iron Python 2.7.3 DLR Hosting API。我想要做的是从 C# 代码调用纯 python 脚本的 python 函数。我从这里举了一个例子,这个简单的代码很有魅力。但我的用例稍微复杂一点,在我的 python 模块中,我正在导入非标准包和模块。

我的模块.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: Attempted relative import in non-package

如果我import mypackage从脚本中删除,一切都会顺利进行。当然,在 python 控制台中,这个脚本工作正常,所有导入都正确解析。还要提一提的是,我的 Visual Studio 项目位于 C:\users\Me\MyDocuments......\PythonDLRTest 并且当然从那里运行。导入位于脚本所示的包,我猜我面临的问题与这些路径有什么关系。

可能有人可以解释我做错了什么以及如何解决这个导入问题。此外,了解 python 和 Ironpython 之间的低级差异以及为什么导入分辨率应该不同也会非常有趣。

4

0 回答 0