기본 콘텐츠로 건너뛰기

라벨이 IronPython인 게시물 표시

IronPython 활용

예전부터 응용 프로그램에 Python을 결합하여 즐겨 사용했는데, 어떤 사용자의 요구사항 때문이었습니다. 그 사용자가 사용하는 프로그램에 계산식이 있는데 계산식이 프로젝트의 특성때문에 조금씩 수정해야 한다는 것이었습니다. 프로젝트마다 계산식을 수정해서 프로그램을 배포하기가 어려워 계산식 자체를 Python 코드로 외부 파일로 빼내는 방식으로 처리했습니다. 어느날 차를 몰고 가는데 전화가 와서 이번 프로젝트에서는 factor 3을 3.5로 바꿔야 하는데 어떻게 하나요? 라고 문의가 왔습니다. Python 파일을 열어 숫자 3을 3.5로 바꾸면 된다고 답변을 해줬습니다. 이렇게 사용자는 프로젝트마다 Python에서 계산식을 수정하여 사용하면 되기 때문에 프로그램을 수정할 필요가 없어집니다. 이전 글 에서도 이야기했듯이 IronPython은 C#과 궁합이 아주 좋아 이번 프로젝트에서도 IronPython을 프로그램에 포함시켰습니다. 자동으로 생성된 배관 라인을 수정하거나 새로 생성하는 기능을 위해 IronPython을 활용했습니다. 먼저 앱 실행 경로를 IronPython 검색 경로에 추가해줍니다. 1 2 3 4 5 6 #region IronPython의 검색 경로에 앱 실행 경로를 추가 var paths  =  _IronPython.GetSearchPaths(); var ExecutePath  =   System .IO.Path.GetDirectoryName(Application.ExecutablePath); paths.Add(ExecutePath); _IronPython.SetSearchPaths(paths); #endregion Colored by Color Scripter cs 아래와 같이 C# Class를 정의하고 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 public   clas...

[IronPython] 변수로 함수 넘기기

SetVariable 함수로 C# 함수를 넘기는 것을 알아 보겠습니다. 먼저 public 함수를 하나 만드시구요, public class FuncForScript { /// <summary> /// return digit part from string /// </summary> /// <param name="sFromString"></param> /// <returns></returns> static public string GetDigitFromString(string sFromString) { string sDigitString = string.Empty; sFromString = sFromString.Trim(); foreach (char c in sFromString) { if (!char.IsLetter(c)) { sDigitString += c; } else { break; } } return sDigitString; } } ScriptScope에서 아래와 같이하여 함수를 넘길 수 있습니다. 1 2 oScriptScope.SetVariable( "GetDigitFromString" ,  new  Func < string ,  string > (FuncForScript.GetDigitFromString)); Colored by Color Scripter cs 이렇게 하면 Python Code에서  아래와 같이 GetDigitFromString함수를 사용할수 있습...

IronPython

아래 글에서 Python.NET을 사용하기로 했는데, PythonEngine.Execute를 호출했을때 리턴 값을 받지 못하는 문제가 발생했습니다. 항상 null을 리턴하는 것이었습니다. 그래서 어쩔수 없이 다른 방법을 찾아야 했는데, 그 대안책이 IronPython입니다. IronPython을 잠시 사용해 본 느낌은 C#과의 결합이 아주 잘 되어있다는 것입니다. C#에서 IronPython의 자료형을 그대로 사용할수 있고, C#에서 IronPython에 변수를 넘겨 줄때에도 아무런 변환없이 C#의 자료형을 사용할수 있습니다. 아래 파일을 참조합니다. 예제 코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 using IronPython.Hosting; using IronPython.Runtime; using Microsoft.Scripting; using Microsoft.Scripting.Hosting;   public partial  class  SpoolListForm : DocumentModuleBase {     private ScriptEngine oPyEngine  =  Python.CreateEngine();        / / /   < summary >      / / /        / / /   < / summary >    ...