2014-03-04 1 views
1

IronPython 로그 함수를 C#에서 사용하려고합니다. 아이디어는 사용자가 평가할 수학 스크립트를 작성하고 응답이 UI에 표시됩니다. 간단한 수학 (덧셈, 뺄셈 등)에이 방법을 사용하면 잘 작동합니다. 로그 함수를 사용해야 할 때 수학 모듈을 가져 오려고하면 실패합니다. 내 코드는 :이 코드를 실행하면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)")`

암의 I 가져 오기 또는 dll이 누락 되었습니까? from System import Math 또는 import System.Math as Math

둘 것 :

+0

수학을 가져온 경우'Calculate ("log (10)")''without 'math' 만 사용할 수 있습니다. –

+0

감사합니다 햄릿, 나는 그 중 하나를 작동하지 않습니다 시도했다. – Softec

+0

귀하의 게시물이 실제 코드가 아닙니다 ... 귀하의 게시물에 소문자 m이있는 "import math"가 포함되어 있습니다. 대신 'import Math'(대문자 m)를 사용할 때 수신중인 오류가 팝업됩니다. 그래서 기본적으로 붙여 넣는 코드는 실제로 작동합니다. – RvdV79

답변

2

IronPython을 아직 설치하지 않았으므로 here에서 최신 안정 버전 (2.7.4)을 설치했습니다. 같은 버전을 사용하고 있는지 확실하지 않습니다 ...

솔루션을 만들 때 참조를 추가해야했습니다. 제 추측은 이것이 당신의 '악마'의 원천이라는 것입니다.

IronPython 설치와 함께 제공되는 'IronPython''Microsoft.Scripting' 참조를 추가했습니다. 정확한 버전은 v4.0.30319 (IronPython 및 Microsoft Scripting 모두)입니다.

내 Windows Forms 응용 프로그램에는 하나의 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)을 계산할 때 (당신이 calculatin g 자연 대수). 내 텍스트 상자에는 다음이 포함

Outcome of log(10): 2,30258509299405 

그래서 하나의 힌트, 당신은 (난 그냥 Microsoft.Scripting보다 몇이 알고) 설치 당신의 ScriptEngine의 다른 버전이 있는지 확인하려고보고있다 솔루션의 참조

희망이 있습니다.

+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 인 로그의 경우 두 번째 인수로 기본을 제공 할 수 있습니다. – Softec

+0

이전에 잘못된 어셈블리 및 참조 문제가 있었으므로 항상주의해야합니다. 나는 그것이 도움이 되었기 때문에 기쁘다! – RvdV79

2

파이썬은 그렇게

System.Math 당신이 원하는 것을 얻을 .. 단지 Math라는 이름의 클래스가없는, 대소 문자를 구분하고,이 import 문을 사용할 필요가 동일한 결과를 얻으십시오 ...

+0

감사합니다 Shlomi, System.Math.Log() 메서드를 호출 할 때 잘 System.Math 사용하고 있었다. 저는 우리 사용자가 System.Math.Log() 대신 math.Log()로 쓰는 데 익숙해 졌으므로 Python 스타일을 사용하고 싶습니다. 그러나 이제는 "from System Import Math"를 사용할 때이 문제가 해결되어 사용자는 평가할 스크립트에 대해 Log()를 쓸 수 있습니다. 답변을 보내 주셔서 감사합니다. 따라서 답변으로 표시하고 있습니다. – Softec

+0

사과 Shlomi, 귀하의 대답은 매우 도움이되었지만 RvdV79의 대답이 내 문제에 더 적절하다고 생각합니다. – Softec

+0

아, 이제 알 겠어 ... 이들은 실제로 두 개의 다른 모듈 (System.Math는 .Net 유형이고 수학은 파이썬 모듈입니다 ...) ... .Net과 그 수학에 "너무"익숙합니다. class –

관련 문제