Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.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
Ironpython通过.NET调用未找到;“数学”;图书馆_Python_.net - Fatal编程技术网

Ironpython通过.NET调用未找到;“数学”;图书馆

Ironpython通过.NET调用未找到;“数学”;图书馆,python,.net,Python,.net,我在C#应用程序中使用了IronPython脚本引擎。它通常工作正常,但由于某些原因,它找不到“数学”库(即,我无法“导入数学”)。我检查了我的DLL(IronPython.DLL、Microsoft.Scripting、Microsoft.Dynamic),它们看起来都是最新版本(我从IronPython2.7.7.0安装中复制了它们)。但是,当我尝试执行“importmath”命令时,它会显示“没有名为math的模块”。我可以导入“sys”和其他模块好的,为什么不导入“math” 以下是我的

我在C#应用程序中使用了IronPython脚本引擎。它通常工作正常,但由于某些原因,它找不到“数学”库(即,我无法“导入数学”)。我检查了我的DLL(IronPython.DLL、Microsoft.Scripting、Microsoft.Dynamic),它们看起来都是最新版本(我从IronPython2.7.7.0安装中复制了它们)。但是,当我尝试执行“importmath”命令时,它会显示“没有名为math的模块”。我可以导入“sys”和其他模块好的,为什么不导入“math”

以下是我的代码的简化版本:

            pyEngine = Python.CreateEngine();
            outputStream = new NotifyingMemoryStream();
            outputStream.TextWritten += OutputStream_TextWritten;
            outputStreamWriter = new StreamWriter(outputStream) { AutoFlush = true };
            pyEngine.Runtime.IO.SetOutput(outputStream, outputStreamWriter);
            pyEngine.Runtime.IO.SetErrorOutput(outputStream, outputStreamWriter);

            ScriptSource source = pyEngine.CreateScriptSourceFromString("import math" + Environment.NewLine + "math.log(10)", Microsoft.Scripting.SourceCodeKind.AutoDetect);
            double b = source.Execute<double>()
pyEngine=Python.CreateEngine();
outputStream=新的NotifyingMemoryStream();
outputStream.textWrited+=outputStream\u textWrited;
outputStreamWriter=新StreamWriter(outputStream){AutoFlush=true};
pyEngine.Runtime.IO.SetOutput(outputStream,outputStreamWriter);
pyEngine.Runtime.IO.SetErrorOutput(outputStream,outputStreamWriter);
ScriptSource=pyEngine.CreateScriptSourceFromString(“导入数学”+Environment.NewLine+“数学.log(10)”,Microsoft.Scripting.SourceCodeKind.AutoDetect);
double b=source.Execute()

错误发生在“双b=源…”行。任何帮助都将不胜感激。

仅将IronPython安装中的IronPython DLL复制到项目中并不能获得标准库

sys
工作的原因是它是少数几个特殊模块中的一个,这些模块不仅仅是“内置的”,而是直接链接或冻结到主解释器中。大多数stdlib都无法工作


简短的版本是:您必须:

  • 同时复制标准库,或
  • 如下图所示,将其引用到位:

    ICollection searchpath=pythonEngine.getsearchpath(); 添加(“D:\Absolute\Path\To\IronPython”); pythonEngine.setSearchPath(搜索路径)

显然,如果您想部署或分发应用程序,后一种解决方案将不起作用


根据和其他一些人的说法,大多数人处理这个问题的方式似乎是
NuGet
stdlib到您的项目中,而不是手动复制。而且,当您使用时,您可以使用
NuGet
IronPython,而不是复制和粘贴DLL

这仍然不能完全解决部署/分发问题,但从那以后,只需配置构建,将
Lib
中的任何部分复制到目标中,基本上与您对DLL的处理方式相同。如果您将部分或全部stdlib库复制到构建目标中,它们将自动位于您的搜索路径上;如果您将它们复制到某个自定义子目录中,那么您当然需要添加它们,如上所示

如果您不打算部署/分发,您可能仍然需要配置副本。但是,如果没有,您可以将
。\\..
添加到您的搜索路径中


(顺便说一句,所有这些肯定不是我模模糊糊记得做过的……但是我记得的东西可能已经过时了。)

有没有可能你有一个名为
math.py
的文件因为某种原因而无法导入(例如语法错误)?(当然,这应该会给你一个更好的错误消息,告诉你
math
有什么问题,而不仅仅是说没有这样的模块,但如果没有,我也不会感到太惊讶。)此外,
sys
的特殊之处在于它通常内置于解释器或冻结在解释器本身,而
math
通常可以在标准库中找到。所以,也许你就是找不到你的标准库。其他stdlib模块是否不工作?你能打印出
sys.path
sys.metapath
并告诉我们他们说了什么吗?请注意,当我只是将iron python作为一个独立的应用程序运行时,“导入数学”工作得很好。我的系统路径在下面。我似乎没有定义sys.metapath。他们似乎只是指向C#program文件夹,该文件夹既没有“Lib”也没有“DLLs”文件夹。我尝试将sys.path修改为指向ironpython安装文件夹的“Lib”文件夹的点,但这似乎没有帮助。我实际上没有看到任何“math.py”“ironpython文件夹中的文件,因此我认为它必须是内部的,因为如果我尝试从ipy本身导入它,它会工作。请将它们输入到您的答案中;不要试图将它们作为注释发布。sys.path:['.','C:\\Users\\michaeld\\Documents\\MEMS\u PROBE\\trunk\\timetraveler\\TimeViewerWPF\\bin\\x64\\Debug\\Lib','C:\\Users\\michaeld\\Documents\\MEMS\u PROBE\\trunk\\timetraveler\\TimeViewerWPF\\bin\\x64\\Debug\\DLLs']是的,这很有效!我做了一个NuGet将标准库添加到项目中,现在一切都很好!非常感谢你的帮助!