2014-03-04 45 views
1

我想在C#中使用IronPython日誌功能。想法是用戶會寫一個數學腳本,這將被評估和答案將顯示在用戶界面。當我使用這種方法進行簡單的數學(加法,減法等)時,它工作正常。當我需要使用日誌功能時,我嘗試導入數學模塊失敗。我的代碼是:導入數學失敗IronPyhton

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無模塊命名的數學計算. I am calling method as ( 「math.log(10)」)`

上午我缺少任何導入或DLL?

+0

我想,如果你導入數學,你可以只使用'Calculate(「log(10)」)''''不要'數學'。 –

+0

感謝哈姆雷特,我曾嘗試過,也不起作用。 – Softec

+0

你的文章不是真實的代碼...你的文章包含小寫m的「導入數學」,當使用'導入數學'(大寫m)代替時,你正在接收的錯誤將彈出。所以基本上,你粘貼的這段代碼實際上是在工作:) – RvdV79

回答

2

我試圖複製你的問題,但我沒有安裝IronPython,所以我安裝了最新的穩定版本(從2.735)到here。我不知道你是否使用相同的版本...

當創建一個解決方案時,我知道我需要添加一些引用。我的猜測是,這是你'邪惡'的根源。

我已經添加了參考'IronPython''Microsoft.Scripting',隨着IronPython的安裝。確切的版本是v4.0.30319(IronPython和Microsoft腳本)。所以我的Windows窗體應用程序有一個文本框和一個按鈕(它只是一個測試畢竟),我複製在您的示例方法稱爲計算,爲了確保我們有相同的,這裏是我的版本:

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); 
    } 
} 

在執行我的應用程序,該程序不顯示錯誤是你的,但它表明,我沒有想到的結局計算日誌(10)(假設你是計算g自然對數)。我的textBox包含:

Outcome of log(10): 2,30258509299405 

所以只有一個提示,試圖找出如果你有不同版本安裝在您的ScriptEngine的(我知道有不僅僅是Microsoft.Scripting更多一些),看看您的解決方案中的參考。

希望它能幫助!

+1

是的,你的猜測是正確的,這是地獄。令人驚訝的是,我的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是不同的,但我不明白爲什麼運行時版本是相同的。感謝您的回答,這非常有幫助。 – Softec

+0

是的,Pyhton默認情況下計算自然日誌。對於以10爲底的日誌,可以將base作爲第二個參數提供。 – Softec

+0

我以前遇到過錯誤的程序集和引用,所以我一直都在關注它。我很高興它雖然幫助! – RvdV79

2

Python是大小寫敏感的,而且,也沒有命名只是Math類..只有System.Math

所以要得到你想要的東西,你需要使用這個import語句:from System import Mathimport System.Math as Math

雙方將讓你得到相同的結果...

+0

謝謝Shlomi,我正在使用System.Math以及當我將方法稱爲System.Math.Log()時它工作正常。我想用Python風格,因爲我們的用戶更習慣於寫作math.Log()而不是System.Math.Log()。然而這個問題現在已經解決了,因爲我現在正在使用「從系統導入數學」,現在用戶可以爲要評估的腳本編寫Log()。感謝你的迴應,這是非常有益的,因此我正在標記爲答案。 – Softec

+0

道歉Shlomi,雖然你的答案是非常有幫助的,但我相信RvdV79的答案更適合我的問題。 – Softec

+0

哦,我現在看到...這些實際上是兩個不同的模塊(System.Math是.Net類型,數學是python模塊...)...我也「習慣」.Net,它的數學類 –