Python 코드를 다른 언어를 통해 실행하는 것을 임베딩한다고 한다.
Visual Studio에서 C# 프로젝트를 생성하여 C# 스크립트 속에서 Python 코드를 실행하는 예제를 실행해볼 것이다.
1. Visual Studio 설치
(굳이 2017 버전을 설치할 필요는 없다) 필자는 아래 url을 통해 설치했다.
https://docs.microsoft.com/ko-kr/visualstudio/releasenotes/vs2017-relnotes
2. pythonnet 설치
필자는 이미 python을 설치했고, pythonnet도 아래 명령어로 설치한 상태이다.
pip install git+https://github.com/pythonnet/pythonnet
3. Visual Studio 설정 변경 및 빌드
1) 가장 먼저 "C# 프로젝트 우클릭 > 속성 > 빌드 탭 > 플랫폼 대상"을 "x64"로 설정한다
설정하지 않고 빌드하면 BadImageFormatException 에러가 난다.
2) 코드를 작성한다.
pythonnet 깃헙에 예제로 나와있는 코드를 복붙한다.
3) Python.Runtime.dll 참조 추가하기
필자는 미리 처리해주어 위 사진에 에러가 없지만, 블로그 글을 순서대로 따라온 분들은 using Python.Runtime; 줄에 에러가 생기는 것을 볼 수 있을 것이다.
이를 해결하기 위해, Python.Runtime.dll을 빌드 환경에서 참조할 수 있도록 프로젝트 참조에 추가해야 한다.
pythonnet을 pip로 설치했으면 다들 Python.Runtime.dll이 site-packages 아래 있을 것이다.
필자는 어디에 있는지 찾기 귀찮아서 아래와 같이 찾았다ㅎ
가상환경 아래에 저장되어있는 파일의 경로를 참고하여 (E:\venv2\lib\site-packages\python.runtime.dll) python.runtime.dll 파일을 C# 콘솔 어플리케이션 프로젝트의 참조에 추가해준다.
이렇게까지 설정해준 후 빌드해주면, 아래와 같이 실행이 잘 된다.
추가적으로
- python을 불러오는 모든 코드는 "using (Py.GIL()) {/* CODE */}" 블럭 안에 있어야 한다.
- python 모듈을 import 하는 방법 : dynamic mod = Py.Import("mod")
모듈을 import한 후, 모듈 내 함수를 호출하는 방법 : mod.func(args)
- mod.func(args, Py.kw("keywordargname", keywordargvalue)) 나, mod.func(args, keywordargname: keywordargvalue)를 사용해서 keyword arguments를 적용한다.
- 모든 python 객체는 dynamic 타입으로 선언되어야 한다.
- 수학 연산을 할 때에는 python 객체를 먼저 써준다 (np.pi * 2는 되고, 2 * np.pi는 안된다)
- venv라는 가상환경을 사용하는 경우, 아래와 같이 코드를 추가한다.
참고 자료
1. https://github.com/pythonnet/pythonnet
2. http://pythonnet.github.io/
4. http://zbaekhk.blogspot.com/2011/06/pythonnet.html
5. https://stackoverflow.com/questions/45239072/importing-python-module-in-c-sharp-using-pythonnet
'개인 저장' 카테고리의 다른 글
티스토리 블로그 수익확인법 (0) | 2020.08.05 |
---|---|
C#,VB.net에서 Alturos.Yolo 사용시 오류발생 문제 해결 (0) | 2020.08.01 |
Berryz+WebShare+0.952/베리즈 웹쉐어 (0) | 2020.07.27 |
GPU-Z (0) | 2020.07.27 |
DLL파일 속성검사 (0) | 2020.06.03 |