본문 바로가기

컴퓨터 프로그래밍

C#에서 Python 으로 만들어진 딥러닝 스크립트를 돌려보자 PROJECT

반응형

c#으로 굳이 Python 스크립트(딥러닝)을 돌리는 이유가 뭐냐고 물어본다면

C#으로 만들어진 Main Infrastructure을 유지하고 싶기 때문이다. 

그렇다고 해서 python 스크립트 전체를 C#으로 컨버팅 하기도 만만치 않은 작업 (어쩌면 불가능)이라고 생각되기 때문.

한번 해봅시다!

1. IronPython

일단 C#에서 python의 함수 메소드들을 호출하는 방법으로 추천되었던 방법이였다. 

일단 다음과 같이 c#콘솔 프로젝트를 만들고 c# 클래스를 다음과 같이 만들었다. 

그리곤, Project1에 참조로 Ironpython 을 다운로드 받고 해당 dll을 참조로 불러왔다. 

console project
project에 참조로 IRONPython을 추가하는 화면

ironpython 을 다운로드 받는 링크는 아래와 같다. 

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

c#코드는 아래와 같다.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using Microsoft.Scripting;
using Microsoft.Scripting.Hosting;


//파이선을 실행하기 위해 추가
using IronPython;
using IronPython.Hosting;
using IronPython.Runtime;
using IronPython.Modules;


namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            //먼저 참조추가에서 IronPython을 추가하야 한다.

            var engine = IronPython.Hosting.Python.CreateEngine();
            var scope = engine.CreateScope();

            try
            {
                //파이선 프로그램 파일 실행.
                var source = engine.CreateScriptSourceFromFile("simple.py");
                source.Execute(scope);

                // call def HelloWorld() :
                var Fnhelloworld = scope.GetVariable<Func

>("HelloWorld");
                Console.WriteLine(Fnhelloworld());

                // call def HelloWorld2(data) :
                var Fnhelloworld2 = scope.GetVariable<Func<object, object>>("HelloWorld2");
                Console.WriteLine(Fnhelloworld2("HelloWorld 2 "));

                // call def ListTest() :
                var FnListTest = scope.GetVariable<Func>("ListTest");

                IronPython.Runtime.List r = (IronPython.Runtime.List)FnListTest();

                foreach (string data in r)
                {
                    Console.WriteLine("result: {0}", data);
                }

                // call class MyClass
                var myClass = scope.GetVariable<Func<object, object>>("MyClass");
                var myInstance = myClass("hello");

                //Console.WriteLine(engine.Operations.GetMember(myInstance, "value"));
               // Console.WriteLine("VALUE: P=")

            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }


        }
    }
}

그리고 Simple.py를 Projet1의 실행파일이 만들어지는 곳에 넣어준다. 

Simple.py 코드는 아래와 같다.

def HelloWorld():
    data = 'Hello World C#'
    return data
  
def HelloWorld2( data ):
    return data
 
def ListTest():
 
    data = []
    data.append('Hello')
    data.append('World')
    data.append('black falcon')
    return data
 
class MyClass(object):
    def __init__(self, value):
        self.value = value

그리곤, c#코드를 실행하면 다음과 같은 결과를 얻을 수 있다 .

c#에서 python스크립트 실행 화면

단순하게 python으로 작성된 함수들을 호출하는 코드이다. 

 

그러면 ironpython을 쓰면 딥러닝도 해결될까? 

그래서 한번 예전에 작생했던 pymysql코드를 가져와봤다. 

하지만 결과는 import 부터 문제였다. 

결과는 아래와 같았으며, 

no module name pymysql

응급처치로 관련 Lib관련된 폴더들을 exe실행파일이 있는곳에 복붙을 했지만

pymysql은 해결되었지만 ... 다른 문제가 발생했었다. 

project1.exe 경로에 pymysql 폴더 전체를 복붙함.
결과는 decimal이 없다고

결과는 decimal이 없다고 하는데 이건 파이썬의 기본 클래스이다. 

이부분은 어떻게 해결해야되는지 고민하고 있다.

 

반응형