来自C#(使用SciPy)的IronPython调用失败,ImportException:";没有名为“mtrand”的模块;
我有一个python库,我正试图通过从C#应用程序调用IronPython(v2.7RC1[2.7.0.30])来使用它。该库非常广泛地使用NumPy和SciPy,当从以下命令行使用ipy运行时,确实可以使用它们:来自C#(使用SciPy)的IronPython调用失败,ImportException:";没有名为“mtrand”的模块;,c#,numpy,scipy,ironpython,python.net,C#,Numpy,Scipy,Ironpython,Python.net,我有一个python库,我正试图通过从C#应用程序调用IronPython(v2.7RC1[2.7.0.30])来使用它。该库非常广泛地使用NumPy和SciPy,当从以下命令行使用ipy运行时,确实可以使用它们: ipy.exe -X:Frames file_from_lib_importing_numpy.py 但是,当我使用下面的代码从C#调用IronPython时,会引发一个异常: ImportException "No module named mtrand" at Micro
ipy.exe -X:Frames file_from_lib_importing_numpy.py
但是,当我使用下面的代码从C#调用IronPython时,会引发一个异常:
ImportException
"No module named mtrand"
at Microsoft.Scripting.Runtime.LightExceptions.CheckAndThrow(Object value)
at IronPython.Runtime.Operations.PythonOps.ImportStar(CodeContext context, String fullName, Int32 level)
at Microsoft.Scripting.Interpreter.ActionCallInstruction3.Run(InterpretedFrame frame)
...
at Microsoft.Scripting.SourceUnit.Execute(Scope scope, ErrorSink errorSink)
at Microsoft.Scripting.Hosting.ScriptSource.Execute(ScriptScope scope)
at Microsoft.Scripting.Hosting.ScriptEngine.ExecuteFile(String path)
at Microsoft.Scripting.Hosting.ScriptRuntime.ExecuteFile(String path)
at Microsoft.Scripting.Hosting.ScriptRuntime.UseFile(String path)
...
调用IronPython的C#代码(其中的一部分)如下所示:
ScriptEngine _engine;
var opts = new Dictionary<string, object>();
opts["Frames"] = ScriptingRuntimeHelpers.True;
_engine = Python.CreateEngine(opts);
var sp = _engine.GetSearchPaths();
sp.Add(@"c:\Program Files\IronPython 2.7");
sp.Add(@"c:\Program Files\IronPython 2.7\DLLs");
sp.Add(@"c:\Program Files\IronPython 2.7\Lib");
sp.Add(@"c:\Program Files\IronPython 2.7\Lib\site-packages");
sp.Add(_path);
_engine.SetSearchPaths(sp);
var _runtime = _engine.Runtime;
var scope = _runtime.ExecuteFile(Path.Combine(_path, "mytest.py"));
在第12行“将numpy作为np导入”中失败。
问题在于IronPython2.7\Lib\site packages\numpy\random\中的文件\uuuu init\uuuuuuu.py
包含以下行
from mtrand import *
它失败了。请注意,mtrand不是一个模块,而是一个目录。
我想不出还有什么别的办法可以让这项工作顺利进行,所以我非常感谢您的帮助。
非常感谢。这不是最好的解决方案,但它对我很有用:
import sys
sys.path.append(r'c:\Program Files (x86)\IronPython 2.7')
sys.path.append(r'c:\Program Files (x86)\IronPython 2.7\DLLs')
sys.path.append(r'c:\Program Files (x86)\IronPython 2.7\Lib')
sys.path.append(r'c:\Program Files (x86)\IronPython 2.7\Lib\site-packages')
import clr
clr.AddReference('mtrand.dll')
import numpy
import scipy
print numpy.__version__
print scipy.__version__
我希望它能有所帮助。我发现,在我的ActivePython V2.7.0.2中,它可以工作:
sys.path.append(r'C:\\Examples')
import examples
(假设examples.py位于C:\examples中)。这不会(没有r):
因为我明白了:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named examples
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
ImportError:没有命名为示例的模块
结论:注意“r”
print sys.path
的输出和sys.path.append(r'c:\Program Files\ironpython2.7')
在import sys
之后的输出是什么?您是对的,从c#调用时,sys.path
不包含应用程序中设置的路径。此外,当我添加行sys.path.append(r'c:\Program Files\ironpython2.7')
时,它会失败,并显示“没有名为numpy的模块”。我真的需要在我想从C#app使用的每个python文件中设置路径吗?换句话说,当搜索路径没有传播到python运行时时,设置搜索路径的目的是什么?将路径添加到python文件并没有解决问题-仍然引发相同的异常。sys.path似乎设置正确(包含附加路径、C#application CWD的Lib和Dll dirs以及正在执行的文件的目录),numpy至少开始得到imported.hmm,您是如何构建mtrand.Dll的?我尝试了pyc.py脚本,即运行ipy pyc.py/main:..\..\Lib\site packages\numpy\random\mtrand\generate\u mtrand\u c.py/out:mtrand/target:dll
,但没有成功,因为我没有构建它。安装程序将其复制到c:\ProgramFiles(x86)\ironpython2.7\DLLs
文件夹.Nice中。在经历了很多头痛之后,这对我起了作用。。。如果它对某人有帮助的话,我把它叫做C#。。。var lang=Python.CreateLanguageSetup(null);lang.Options[“Frames”]=ScriptingRuntimeHelpers.True;var setup=new ScriptRuntimeSetup();setup.LanguageSetups.Add(lang);var runtime=新脚本运行时(设置);var engine=runtime.GetEngine(“py”);engine.ExecuteFile(“mytest.py”);对我来说也很有用-但是我不知道为什么这是必要的。在所有DLL都位于同一目录中之后,其他DLL似乎在加载时没有对它们执行AddReference。在前缀为“r”的字符串文字中,以\开头的转义序列被禁用。这对于filepath很方便,因为\是路径分隔符,您不希望它启动转义序列。(r'C:\Examples')==('C:\\Examples')
sys.path.append('C:\\Examples')
import examples
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named examples