我正在尝试在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否模块名为math .
I am calling method as
Calculate(“math.log(10)”)`
我错过了任何导入或dll吗?
答案 0 :(得分:2)
Python区分大小写,并且没有名为Math
的类..仅System.Math
为了得到你想要的东西,你需要使用这个导入语句:from System import Math
或import System.Math as Math
两者都会得到相同的结果......
答案 1 :(得分:2)
我试图复制你的问题,但是我还没有安装IronPython,所以我从here安装了最新的稳定版本(2.7.4)。我不确定你是否使用相同的版本...
创建解决方案时,我知道我需要添加一些引用。我的猜测是,这是你的邪恶的来源。
我添加了引用'IronPython'
和'Microsoft.Scripting'
,它们随IronPython的安装一起提供。确切的版本是v4.0.30319(IronPython和Microsoft Scripting)。
所以我的Windows窗体应用程序有一个textBox和一个按钮(它毕竟只是一个测试),我复制了你的示例方法,名为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)时所期望的结果(假设您正在计算自然对数)。我的textBox包含:
Outcome of log(10): 2,30258509299405
所以只有一个提示,试着找出你是否安装了不同版本的ScriptEngine(我知道还有一些不仅仅是Microsoft.Scripting)并查看引用你的解决方案。
希望它有所帮助!