Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
来自C#(使用SciPy)的IronPython调用失败,ImportException:";没有名为“mtrand”的模块;_C#_Numpy_Scipy_Ironpython_Python.net - Fatal编程技术网

来自C#(使用SciPy)的IronPython调用失败,ImportException:";没有名为“mtrand”的模块;

来自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

我有一个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 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