C#/기본

[ironpython] C#에서 python 코드 실행하기

vmpo 2019. 10. 13. 21:49

사전준비 : python이 설치되어 있어야 합니다.

https://vmpo.tistory.com/entry/python-%EC%95%84%EB%82%98%EC%BD%98%EB%8B%A4anaconda-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0-%EC%9C%88%EB%8F%84%EC%9A%B0-10?category=732993

 

[python] 아나콘다(anaconda) 설치하기 -윈도우 10

윈도우 10 환경에 python설치를 진행해보겠습니다. python을 단독으로 설치해도 좋지만, 아나콘다를 설치할 경우 python관련 라이브러리를 한꺼번에 받을 수 있기 때문에 초기 셋팅하기가 편리해집니다. 아나콘다..

vmpo.tistory.com

IronPython으로 C#에서 파이썬 실행하기


visual studio를 실행해 샘플 콘솔응용프로그램 하나를 준비합니다.

 

 

C#에서 파이썬 코드 실행을 위해선 ironpython이라는 라이브러라 하나를 다운로드 해야합니다. 

ironpython을 구글에 검색하시고 아래 웹사이트에서 다운로드 받아도 됩니다.

*ironpython을 사용하지 않고도 python을 실행 할 수 있습니다. 본 포스팅에서 해당 내용도 함께 확인 해보겠습니다.

 

https://ironpython.net/

 

IronPython.net /

IronPython is an open-source implementation of the Python programming language which is tightly integrated with the .NET Framework. IronPython can use the .NET Framework and Python libraries, and other .NET languages can use Python code just as easily. Why

ironpython.net

저는 visual studio의 nuget 패키지 관리자를 활용하도록 하겠습니다.

도구 -> nuget패키지 관리자 -> 패키지 관리자 콘솔을 클릭합니다.

패키지 관리자 콘솔을 클릭하면 visual studio 하단에 아래 화면이 노출됩니다.

 

ironPython 다운로드를 위해선 콘솔창에 아래 명령어를 입력해야 합니다.

 

Install-Package IronPython -Version 2.7.9

 

 

입력하면 아래 화면과 같이 설치가 진행됩니다.

 

 

 

C#에서 python코드 작성을 위한 준비가 완료되었습니다.

실제 코드 작성 후 테스트 해보도록 하겠습니다.

 

간단한 함수 2개와 print문 하나를 넣어보겠습니다.

 

python 코드

 

 

C# 코드

저와 동일하게 코드를 작성하신 경우 .py파일 의 경로를 콘솔 프로그램이 컴파일 되는 동일 한 경로에 

업로드 해주셔야 합니다. (visual studio 프로젝트 경로 bin/deug 폴더)

c#코드를 실행을 해보면,

정상적으로 출력된 것을 알 수 있습니다.

 

아래와 같이 CreateScriptSourceFromString 메소드를 사용하면 스크립트를 직접 작성해서 출력 할 수 도 있습니다.

 

 

아래는 테스트용으로 사용한 샘플코드 입니다. 필요시 복사해서 확인해주세요.

<C# 복사코드>

using System;
using System.Diagnostics;
 
namespace vmpoStudy02
{
    class Program
    {
        static void Main(string[] args)
        {
 
            var engine = IronPython.Hosting.Python.CreateEngine();
            var scope = engine.CreateScope();
 
            try
            {
                //파일을 읽지 않고 스크립트를 바로작성
                var source = engine.CreateScriptSourceFromFile(@"test.py");
                source.Execute(scope);
 
                var getPythonFuncResult = scope.GetVariable<Func<string>>("getPythonFunc");
                Console.WriteLine("def 실행 테스트 : " + getPythonFuncResult());
 
                var sum = scope.GetVariable<Func<int,int,int>>("sum");
                Console.WriteLine(sum(12));
 
                //파일을 읽지 않고 스크립트를 바로작성
                var source2 = engine.CreateScriptSourceFromString(@"print('스크립트를 직접작성해 출력 테스트')");
                source2.Execute(scope);
 
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
 
        }
    }
}
 

 

<python 복사코드>

def getPythonFunc():
    return "hello"
 
def sum(a,b):
    return a+b
 
print('hello iron python')
 

 

 

ironpython을 사용하지 않고 실행하는 방법(ProcessStartInfo)


C#에서 프로세스를 코드에서 실행 할 수 있는 ProcessStartInfo 클래스를 활용해 파이썬을 실행하도록 하겠습니다.

 

아래 코드는 네이버 메인 화면을 크롤링하는 파이썬 코드입니다.

BeautifulSoup이 설치되어 있지 않은 경우,

cmd에서 pip install BeautifulSoup4를 입력해서 라이브러리를 다운로드 해주도록 합니다.

 

파이썬 코드

import urllib.request
import bs4
 
html = urllib.request.urlopen(url)
 
bs_obj = bs4.BeautifulSoup(html, "html.parser")
top_right = bs_obj.find("div", {"class":"area_links"})
print(top_right)
 
 

 

C#코드

위에서 작성한 파이썬 코드를 ProcessStartInfo 클래스를 활용해 

실행하는 코드입니다.

results에 실행한 코드 리턴값이 저장되게 됩니다.

using System;
using System.Diagnostics;
 
namespace vmpoStudy03
{
    class Program
    {
        static void Main(string[] args)
        {
            //프로세스 파일명 정의
            //파이썬 exe를 직접 실행해서 파이썬 코드가 실행되도록 한다.
            var psi = new ProcessStartInfo();
            psi.FileName = @"C:\python\python.exe"//파이썬 설치 경로
            psi.Arguments = $"\"C:\\dev532\\python\\py532\\s01\\test.py\""//파일경로
 
            //3) Proecss configuration
            psi.UseShellExecute = false;
            psi.CreateNoWindow = true;
            psi.RedirectStandardOutput = true;
            psi.RedirectStandardError = true;
 
            //4) return value def
            var erros = "";
            var results = "";
 
            using (var process = Process.Start(psi))
            {
                erros = process.StandardError.ReadToEnd();
                results = process.StandardOutput.ReadToEnd();
            }
 
            Console.WriteLine(erros);
            Console.WriteLine(results);
 
        }
    }
}
 

C#코드를 실행해보면 정상적으로 print() 값이 출력되는 것을 알 수 있습니다.

 

C# 코드 배포없이 python코드만 변경해서 원하는 기능을 만들 수 도 있을 것 같습니다.

이것으로 python코드 c#에서 실행 포스팅을 마치겠습니다.

LIST