본문 바로가기

개인 저장

[Pythonnet] Python for .NET (embedding python)

728x90

Python 코드를 다른 언어를 통해 실행하는 것을 임베딩한다고 한다.

Visual Studio에서 C# 프로젝트를 생성하여 C# 스크립트 속에서 Python 코드를 실행하는 예제를 실행해볼 것이다.

 

1. Visual Studio 설치


(굳이 2017 버전을 설치할 필요는 없다) 필자는 아래 url을 통해 설치했다.

 

https://docs.microsoft.com/ko-kr/visualstudio/releasenotes/vs2017-relnotes

 

Visual Studio 2017 15.9 릴리스 정보

Visual Studio 2017의 향상된 최신 기능에 대한 릴리스 정보입니다. Visual Studio를 사용하여 더 효과적으로 계획하고, 함께 코딩하여 빠르게 제공하세요.

docs.microsoft.com

 

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

 

 

pythonnet/pythonnet

Python for .NET is a package that gives Python programmers nearly seamless integration with the .NET Common Language Runtime (CLR) and provides a powerful application scripting tool for .NET develo...

github.com

 

 

2. http://pythonnet.github.io/

 

 

Python for .NET

homepage

pythonnet.github.io

 

3. https://m.blog.naver.com/PostView.nhn?blogId=oldfark&logNo=221559498594&proxyReferer=https%3A%2F%2Fwww.google.com%2F

 

 

Python for .NET 사용법

https://github.com/pythonnet위의 사이트에서 찾아가면서 관련 정보를 찾아보면 된다.​개발환경Windows ...

blog.naver.com

 

 

 

4. http://zbaekhk.blogspot.com/2011/06/pythonnet.html

 

 

Python.NET

이번에 예정인 프로젝트가 C#을 사용할 것이기 때문에 C#과 python을 어떻게 연동할지 찾아 보았습니다. 가장 눈에 띄는게 IronPython이었는데요,  인터넷상의 대부분의 문서들이 .NET 4.0에서 환경에서 연동하는 것을 설명하였습니다....

zbaekhk.blogspot.com

 

 

5. https://stackoverflow.com/questions/45239072/importing-python-module-in-c-sharp-using-pythonnet

728x90

'개인 저장' 카테고리의 다른 글

티스토리 블로그 수익확인법  (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