파이썬 코드 윈도우 WPF(C#) UI로 배포(exe파일)

인터넷에 파이썬을 검색하면 항상 같이 나오는 것이 웹 크롤러가 나온다

개인적으로 개발언어라는건 용도에 따라 자유롭게 사용해야된다고 생각하는데
크롤링같은 웹 패킷 제어는 파이썬이 가장 적합하다고 생각된다.

라이브러리가 너무 압도적으로 편하기 때문에.. 다른 언어로 크롤링스크립트를 만든다는건 생각만 해도 끔직하다.

그런데 이런 기능의 툴을 배포하자니 너무 곤욕스러운데
IronPython으로 해답을 어느정도 찾은것 같다.

"""물론 내가 C#스킬이 부족해서 허접한 코딩조각이 있을 수 있으니 댓글로 수정"""

순서
1. 파이선 코드 C#에서 실행
2. 파이썬 pip로 설치한 라이브러리 C#에서 import (MultipartPostHandler, urllib2, cookielib 등)



1. 파이썬 코드 C#으로 실행 시키기
(1)솔루션 우클릭 -> NuGet패키지 관리 -> 찾아보기 -> IronPython 검색 -> 설치

[IronPython 패키지 다운로드]



(2)파이썬 프로젝트를 생성해서 간단한 코드를 테스트 해보자


이처럼 파이썬 프로젝트를 생성하면 솔루션 탐색기에 [Python환경]탭이 생기는데(아래)
이걸 클릭하면 PC에 설치된 파이썬버전을 선택하고 환경을 좀 바꿀 수 있다.


기존에 사용하던 파이썬 코드가 2.7버전이라 난 2.7버전을 기본 환경으로 설정하고,
간단한 함수를 작성해보겠다.


(3)C#환경에서 파이썬 함수 호출하기

테스트용 py소스
def test(id,pw):
    print id
    print pw



c#에서 파이썬 파일 호출
//ironpython 모듈
using IronPython;
using IronPython.Hosting;
using IronPython.Runtime;
using IronPython.Modules;
...namespace 지정...

class PyConn
    {
        public string PyPush(string AppPath, string id, string passwd)
        {
            var engine = IronPython.Hosting.Python.CreateEngine();
            var scope = engine.CreateScope();
            string ret = "";

            try
            {
                var source = engine.CreateScriptSourceFromFile(AppPath+@"PyInclude\PyConn.py"); //개인이 지정한 리소스파일 // 복붙시 주석 하고 밑에꺼 쓰기
                //var source = engine.CreateScriptSourceFromFile(@"D:\IDE\SDsoft\SDone\MPH.py\MPH.py.py"); //실행시킬 파이썬 경로
                source.Execute(scope);
                  var report = scope.GetVariable>("test");// 파이썬 소스에서 정의한 함수 불러오기  >("함수명")
                //Console.WriteLine(report(id,passwd));
                ret = Convert.ToString( report(id, passwd));
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }

            return ret;
        }
    }


이런식으로 파이썬 파일의 경로를 직접 참조하여 파이썬파일을 실행 시킬 수 있다


2. 파이썬 pip로 설치한 라이브러리 C#에서 import (MultipartPostHandler, urllib2, cookielib 등)

그런데  내가 겨우 파이썬 기본 구문이나 쓰려고 이렇게 삽질을 한건 아니고,
미리 만들어둔 웹 크롤러기능을 수행하는 소스파일을 wpf UI로 불러오려고 시간을 쓴것이다.

위의 소스에 파이썬 모듈을 추가하면 "No Module Name ****" 라는 에러를 미친듯이 뿌려대길래 찾은 해법은 ... 그냥 파이썬 모듈이 있는 lib 파일을 전부 리소스로 말아머리고 컴파일하는 것이였다.

(1)파이썬 리소스 말기
Python 설치 경로에 있는 \Lib, 그리고 pip로 설치한 패키지 경로 Lib\site-packages에 있는 파일을 리소스 파일로 추가시키자


(2)파이썬 모듈 import , C# 리소스 참조경로 추가

파이썬 모듈 추가

import MultipartPostHandler
import time,sys,urllib2,urllib,cookielib,time
#모듈을 마구마구 추가하자
...
...
...


C# 리소스 참조 경로  추가

//ironpython 모듈
using IronPython;
using IronPython.Hosting;
using IronPython.Runtime;
using IronPython.Modules;
...namespace 지정...

class PyConn
    {
        public string PyPush(string AppPath, string id, string passwd)
        {
            var engine = IronPython.Hosting.Python.CreateEngine();
            var scope = engine.CreateScope();
            string ret = "";

            //파이썬 모듈 참고 경로를 추가하자
            paths.Add(AppPath+@"Lib\site-packages");
            paths.Add(AppPath+@"Lib");
            paths.Add(AppPath + @"DLLs");
            engine.SetSearchPaths(paths);

            try
            {
                var source = engine.CreateScriptSourceFromFile(AppPath+@"PyInclude\PyConn.py"); //개인이 지정한 리소스파일 // 복붙시 주석 하고 밑에꺼 쓰기
                //var source = engine.CreateScriptSourceFromFile(@"D:\IDE\SDsoft\SDone\MPH.py\MPH.py.py"); //실행시킬 파이썬 경로
                source.Execute(scope);
                  var report = scope.GetVariable>("test");// 파이썬 소스에서 정의한 함수 불러오기  >("함수명")
                //Console.WriteLine(report(id,passwd));
                ret = Convert.ToString( report(id, passwd));
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }

            return ret;
        }
    }


(3) WFP UI에서 파이썬코드 사용 하기~


웹 로그인 기능을 간단하게 파이썬으로 구현해둔 소스를 WFP UI를 통해 출력하도록 하였다.


그 누구도 안볼지 모를 게시물이지만 내 입장에서는 활용도가 매우 높은 방법!


댓글

  1. 안녕하세요 덕분에 연동은 잘되었습니다만.. 제가 파이썬의 beautifulsoup4와 requests 를 이용하여 네이버 실시간 검색어를 파싱한후에 이를 리스트에 넣고 return 하는 파이썬 코드를 작성하였습니다.

    파이썬에서 print해서 보면 정상적으로 값도 입력되고 합니다만..

    이걸 C#에서 읽어오니 'converting to unicode: need string, got bytes' 라는 오류가 뜹니다 대강보니 byte 형식이 아닌 string 형식으로 줘야한단 소리같은데.. 이미 List안에 있는것들은 전부 String일것인데 왜 이러한 오류가 뜨는걸까요?

    beautiful soup에서 넘겨주는 값자체가 byte여서 그런가요..

    답글삭제
    답글
    1. 받아올때 object로 받아오면 해결되지 않을까 예상해봅니다...

      삭제
  2. numpy 나 scipy 같은건 리소스에 어떻게 추가하나요?

    답글삭제
  3. 폴더 형태로 되어 있은 패키지들을 어떻게 c# 리소스로 한번에 추가할수있나요?

    답글삭제

댓글 쓰기

이 블로그의 인기 게시물

[WPF] 텍스트 에디터 - AvalonEdit 사용/제어

(아이온 매크로)아이온 일반 키보드로 H/W스왑 매크로