NotePad

C# 과 Python 연동

졸려질려 2020. 1. 7. 10:16
반응형

1. IronPython 설치


  • Visual Studio 2019 - 도구 - Nuget 패키지 관리자 - 패키지 관리자 콘솔

    PM> Install-Package IronPython -Version 2.7.9

2. Python 코드

3. C# 코드


디렉터리 구분자는 역슬래시(\)가 아니다.

4. C# 코드 실행

알아낸 점

IronPython 실행과정

  1. 엔진 생성

     var engine = IronPython.Hosting.Python.CreateEngine();
  2. 스코프 생성

     var scope = engine.CreateScope();
  3. 파일 읽기

     var source = engine.CreateScriptSourceFromFile("~~~~~~~");
  4. 스코프를 넣어 파일 실행

     source.Execute(scope);

파이썬 함수는 어떻게 실행 시킬 수 있을까?

파이썬 코드

C# 코드와 실행 결과

알아낸 점

처음 Hello World를 출력했을 때와 C# 코드에서 차이가 나는 부분은 다음과 같다.

    var getPythonFunc = scope.GetVariable<Func<string>>("getHello");
    Console.WriteLine("def 실행 테스트 : " + getPythonFunc());

    var sum = scope.GetVariable<Func<int, int, int>>("sum");
    Console.WriteLine("def 실행 테스트 : " + sum(2,3));

우선, 함수를 실행시킬 때는 engine이 아니라 scope에서 GetVariable 함수를 실행한다.
이름 그대로 scope는 파이썬 코드를 부분적으로 볼 수 있게 해주는 기능을 하는 것 같다.
GetVariable에서 Func<> 는 Visual Studio에서 설명을 잘 해준다.

간단히 정리하면 Func<> 안에 자료형을 여러개 넣을 수 있다. 넣은 자료형이 하나일 경우에는 불러들일 함수가 매개변수를 필요로 하지않고 string을 반환하기만 하는 함수라는 뜻이다. 한편, 자료형을 여러개 넣었을 경우에는 오른쪽 끝에 자료형은 반환값의 자료형 을 나타내고, 그 외 자료형들은 불러들일 함수가 필요로 하는 매개변수들의 자료형이다.
마지막으로, GetVariable의 인자값은 불러들일 파이썬 함수의 이름을 넣으면 된다.
정리를 해보면 다음과 같다.

var [파이썬 함수를 저장 할 C#변수] = scope.GetVariable<Func<[파이썬 함수의 매개변수 자료형, 파이썬 함수의 반환형]>>([파이썬 함수명]);


파이썬 클래스는 어떻게 실행할까?

파이썬 코드

C# 코드와 출력 결과

알아낸 점

함수를 불러냈을 때와 살짝 다른점을 볼 수 있다.
scope.GetVarialbe("Hello")(1,2) 는 파이썬 코드에서 Hello 클래스의 생성자를 실행시킨다. 따라서, 생성자에 매개변수가 필요하다면 GetVariable을 할 때 생성자의 매개변수에 맞게 값을 넣어준다. getPythonClass가 파이썬의 클래스로 초기화가 되면 보통 클래스의 메소드를 쓰는 방법과 똑같이 사용할 수 있다.

반응형