C#에서 python스크립트를 실행 할 수 있는 라이브러리인 ironpython가 있습니다.

 

예를들어, 크롤링 로직만 python으로 구현하려는 경우 urllib , beautifulSoup같은 라이브러리 import가 필요합니다.

하지만, 해당 모듈을 import한 스크립트를 c#에서 실행할 경우 no module named 오류가 지속적으로 발생할 수 있습니다.

 

무엇이 문제인지 답도 안나와서 몇시간 삽질 끝에 확인한 결과입니다.

 

결론 : 

ironpython은 파이썬 2.7버전과 호환됨

path설정으로 python 2.7버전 라이브러리 경로를 지정해주어야 함.

 

 

구글검색 결과,

현재, 오픈되어있는 ironpython 자체가 파이썬 3.x 버전과 정상적으로 호환되지 않는 것으로 보입니다.

ironpython을 사용할 경우 python 2.7로 작성된 스크립트가 필요합니다.

또한, python 2.7버전 라이브러리를 읽을 수 있도록 약간의 수정이 필요합니다.

 

 

아래와 같은 파이썬 코드를 C#에서 실행하려고 합니다.

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

파이썬 2.7 기준으로 작성되었습니다.

 

해당 파이썬 코드를 C#에서 실행하는 코드입니다.

paths.Add()를 통해 python2.7 버전 관련 라이브러리가 저장되어 있는 path를 추가해줍니다.

이럴 경우, 파이썬 스크립트 실행시 해당 경로에 있는 라이브러리를 참조해 파이썬 스크립트를 실행 할 수 있습니다.

 

 

실제 실행 해보면 아래와 같이 정상적으로 ironpython으로 크롤링 스크립트를 실행 한 것을 확인 할 수 있습니다.

한글이 깨지는 부분은 깨진 영역만 추출해 파이썬 코드에서 decode()처리를 해주어야 합니다.

 

"네이버를 시작페이지로"는 decode해서 출력한 부분입니다.

 

 

ironpython으로 c#에서 파이썬을 실행이 필요한 경우 참고.

 

 

<복사코드 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();
            var paths = engine.GetSearchPaths();
 
            //파이썬 모듈 참고 경로를 추가하자
            paths.Add(@"C:\Python27");
            paths.Add(@"C:\Python27\DLLs");
            paths.Add(@"C:\Python27\Lib");
            paths.Add(@"C:\Python27\Lib\site-packages");
 
            engine.SetSearchPaths(paths);
 
            try
            {
                //파일을 읽지 않고 스크립트를 바로작성
                var source = engine.CreateScriptSourceFromFile(@"C:\dev532\python\python27test\test.py");
                source.Execute(scope);
 
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
 
        }
    }
}
 
 

<복사코드 python>

# -*- coding: utf-8 -*-
import urllib2
import bs4
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
 
request = urllib2.Request(url)
data = urllib2.urlopen(request).read()
 
bs_obj = bs4.BeautifulSoup(data, "html.parser")
top_right = bs_obj.find("div", {"class":"area_links"})
rs = top_right.select(".al_favorite")
 
print(top_right)
print(rs[0].text.decode('utf-8'))
 
 
 
 
 
LIST
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기