【问题标题】:Import math fails in IronPyhtonIronPyhton 中的导入数学失败
【发布时间】:2014-03-04 20:47:20
【问题描述】:

我正在尝试在 C# 中使用 IronPython 日志功能。想法是用户将编写一个数学脚本,该脚本将被评估并在 UI 中显示答案。当我将这种方法用于简单的数学运算(加法、减法等)时,它工作得很好。当我需要使用日志功能时,我尝试导入数学模块失败。我的代码是:

public double Calculate(string script)
{
    ScriptEngine engine = Python.CreateEngine();
    ScriptSource source = engine.CreateScriptSourceFromString("import math" + System.Environment.NewLine + script, SourceCodeKind.AutoDetect);
    return source.Execute<double>();
}

当我运行此代码时,我得到异常'IronPython.Runtime.Exceptions.ImportException No Module named math. I am calling method as Calculate("math.log(10)")`

我是否缺少任何导入或 dll?

【问题讨论】:

  • 我认为,如果你导入了数学,你可以只使用 Calculate("log(10)") 而不使用 math
  • 谢谢哈姆雷特,我试过了也没用。
  • 您的帖子不是真正的代码...您的帖子包含带有小写 m 的“导入数学”,当使用“导入数学”(大写 m)时,您收到的错误将弹出.所以基本上,你粘贴的这段代码实际上是有效的:)
  • 我在使用旧版本 IronPython 和 Microsoft.Script 和 Microsoft.Dynamic dll 的小写“m”的数学运算时遇到了异常。我在数学中使用小写 m 因为我想使用 Python 数学函数。对于 CSharp 数学函数,您需要使用“import System.Math”。如果你只使用'import Math',你会一直得到异常。

标签: c# math ironpython


【解决方案1】:

我试图复制您的问题,但是我还没有安装 IronPython,所以我从here 安装了最新的稳定版本 (2.7.4)。不知道你用的是不是同一个版本...

在创建解决方案时,我知道我需要添加一些参考。我的猜测是,这就是你“邪恶”的根源。

我添加了引用 'IronPython''Microsoft.Scripting',它们是在安装 IronPython 时附带的。确切的版本是 v4.0.30319(IronPython 和 Microsoft Scripting)。

所以我的 Windows Forms 应用程序有一个文本框和一个按钮(毕竟这只是一个测试),我复制了你的名为 Calculate 的示例方法,以确保我们有相同的,这是我的版本:

 public double Calculate(string script)
 {
   ScriptEngine engine = Python.CreateEngine();
   ScriptSource source = engine.CreateScriptSourceFromString("import math" + Environment.NewLine + script, Microsoft.Scripting.SourceCodeKind.AutoDetect);
   return source.Execute<double>();
 }

在我的按钮的事件处理程序中,我放置了以下代码:

private void button1_Click(object sender, EventArgs e)
{
  try
  {
    double outcome = Calculate("math.log(10)");
    tbOutcome.Text = string.Format("Outcome of log(10): {0}", outcome);
  }
  catch (Exception ex)
  {
    MessageBox.Show(ex.Message, "Error occured...", MessageBoxButtons.OK, MessageBoxIcon.Error);
  }
}

在执行我的应用程序时,程序并没有像您那样显示错误,但它显示了我在计算 log(10) 时所期望的结果(假设您正在计算自然对数)。我的文本框包含:

Outcome of log(10): 2,30258509299405

所以只有一个提示,请尝试找出您是否安装了 不同 版本的 ScriptEngine(我知道除了 Microsoft.Scripting 之外还有几个),并查看参考资料你的解决方案。

希望对你有帮助!

【讨论】:

  • 是的,你猜对了,它是 dll 地狱。令人惊讶的是,我的 dll 的运行时版本与您提到的相同(v4.0.30319),但所有 dll 的版本显示为 0.0.0.0(这些是我之前下载过的 dll)。我下载了具有相同运行时版本(v4.0.30319)的新 dll,但 IronPython 的版本显示为 2.7.0.40,Microsoft.Dynamic 和 Microsoft.scripting dll 的版本显示为 1.1.0.20。这些 dll 肯定是不同的,但我不明白为什么运行时版本是相同的。感谢您的回答,这对您有很大帮助。
  • 是的,Pyhton 默认计算自然对数。对于以 10 为底的日志,可以提供 base 作为第二个参数。
  • 我以前遇到过错误的程序集和引用,所以我一直在关注这一点。我很高兴它有所帮助!
【解决方案2】:

Python 区分大小写,并且没有仅命名为 Math.. 的类仅命名为 System.Math

所以要得到你想要的,你需要使用这个导入语句:from System import Mathimport System.Math as Math

两者都会得到相同的结果...

【讨论】:

  • 感谢 Shlomi,我正在使用 System.Math,当我将方法称为 System.Math.Log() 时它工作正常。我想使用 Python 风格,因为我们的用户更习惯于编写为 math.Log() 而不是 System.Math.Log()。然而,这个问题现在已经解决了,因为我现在使用“从系统导入数学”,现在用户可以只为要评估的脚本编写 Log()。感谢您的回复,这非常有帮助,因此我将其标记为答案。
  • 抱歉 Shlomi,虽然您的回答很有帮助,但我相信 RvdV79 的回答更适合我的问题。
  • 哦,我现在明白了……这实际上是两个不同的模块(System.Math 是 .Net 类型,math 是 python 模块……)……我“太”用了到 .Net 及其数学类
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-04
  • 1970-01-01
  • 1970-01-01
  • 2013-05-30
  • 2011-06-23
  • 2010-12-26
相关资源
最近更新 更多