28 11월 2024
개발자는 이미 기능을 훌륭하게 수행하는 잘 확립되고 테스트된 C# 라이브러리를 가지고 있는 상황에 직면할 수 있습니다. 하지만 클라이언트는 Python 환경에서 작업하며 이 라이브러리의 기능에 접근할 필요가 있습니다. 이러한 경우 개발자는 C# 라이브러리를 Python에서 사용할 수 있도록 통합하는 방법을 찾아야 합니다. 이 기사에서는 이 과제를 해결하기 위한 두 가지 접근 방식, 즉 래핑과 코드 변환을 검토하고 그 장단점을 논의합니다. 이를 통해 가장 적합한 방법을 선택하고 C# 라이브러리의 기능을 Python에서 쉽게 사용할 수 있도록 할 수 있습니다.
앞서 언급했듯이, C# 코드를 Python 환경에 통합하는 주된 방법은 두 가지가 있습니다: 래핑과 코드 변환입니다.
그럼 각 방법을 자세히 살펴보겠습니다.
프로그래밍 언어 간의 코드를 변환하는 것은 특히 언어의 패러다임과 구문이 다를 때 어려운 작업일 수 있습니다. 그러나 많은 기본 구조는 C#과 Python이 유사하므로 간단한 경우 변환 과정은 구문 변경 및 특정 개념의 적응으로 귀결됩니다.
C# 라이브러리의 예 (MyLibrary.cs)
using System;
namespace MyLibrary
{
public class Greeting
{
public string SayHello(string name)
{
return $"Hello, {name}!";
}
}
}
Python으로 라이브러리 번역 (mylibrary.py)
class Greeting:
def say_hello(self, name):
return f"Hello, {name}!"
Python 프로젝트에서 번역된 라이브러리를 사용하는 예
# 클래스 가져오기
from mylibrary import Greeting
# Greeting 클래스의 인스턴스 생성
greet = Greeting()
# say_hello 메서드 사용
message = greet.say_hello("World")
print(message)
이와 같은 간단한 예에서는 변환이 매우 매력적으로 보입니다, 그렇죠? 하지만 이 방법의 장단점을 살펴보겠습니다.
예를 들어, 다음 코드를 Python으로 변환하는 것은 매우 어려울 것입니다:
using System;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax;
namespace MyLibrary
{
public class Greeting
{
public string SayHello(string name)
{
var tree = CSharpSyntaxTree.ParseText($"public class Hello {{ public string Name => \"{name}\"; }}");
var root = (CompilationUnitSyntax)tree.GetRoot();
var classDeclaration = (ClassDeclarationSyntax)root.Members[0];
var className = classDeclaration.Identifier.Text;
return $"Parsed class name: {className}";
}
}
}
노동집약성, 성능 및 외부 종속성의 문제는 종종 중요해지며, C# 라이브러리를 Python에 통합하는 또 다른 방법인 래퍼를 만드는 것을 고려하게 됩니다.
C# 코드를 래핑하는 것은 전문 라이브러리나 도구를 사용하여 C# 코드를 Python과 연결하는 인터페이스를 만드는 것을 포함합니다. 이를 통해 Python 코드에서 직접 C#으로 작성된 메서드를 호출할 수 있습니다. 이 접근 방식의 장점은 기존 코드를 다시 작성할 필요가 없으며 시간과 노력을 절약할 수 있다는 점입니다. 또한 .NET 생태계의 모든 기능을 활용할 수 있으며 이러한 기능을 Python으로 포팅하는 것에 대해 걱정할 필요가 없습니다.
C# 코드를 래핑하는 방법은 여러 가지가 있으며, 가장 인기 있는 방법은 Python.NET 라이브러리와 우리 CodePorting.Wrapper Cs2Python과 같은 전문 도구를 사용하는 것입니다.
앞서 언급한 C# 라이브러리 MyLibrary
는 다음과 같이 Python에서 사용할 수 있습니다:
import clr
clr.AddReference("MyLibrary.dll")
from MyLibrary import Greeting
greet = Greeting()
message = greet.SayHello("World")
print(message)
Microsoft.CodeAnalysis
에 종속성이 있는 경우, 상황은 더 복잡해집니다:
import clr
# 모든 종속성 추가
clr.AddReference("Microsoft.CodeAnalysis.dll")
clr.AddReference("Microsoft.CodeAnalysis.CSharp.dll")
...
clr.AddReference("System.Collections.Immutable.dll")
clr.AddReference("MyLibrary.dll")
from MyLibrary import Greeting
greet = Greeting()
message = greet.SayHello("World")
print(message)
외부 종속성을 명시적으로 연결해야 하는 필요성과 특정 데이터 유형을 전달하는 데 어려움과 같은 제한 사항이 있기 때문에, Python.NET 라이브러리를 사용하여 C# 코드를 통합하는 것은 복잡할 수 있습니다. 이러한 경우, 더 편리하고 자동화된 솔루션을 제공할 수 있는 대체 도구를 고려해볼 가치가 있습니다.
CodePorting.Wrapper Cs2Python은 표준 Python 확장인 Wheel 패키지(WHL)의 형태로 C# 라이브러리를 Python에 통합하는 편리한 방법을 제공합니다. 이 패키지는 pip
을 통해 쉽게 설치할 수 있으며, Python 프로젝트에서 사용할 수 있습니다. 이 도구는 C# 코드를 Python과 연결하는 중간 레이어를 자동으로 생성합니다. 또한, C# 라이브러리의 모든 종속성이 자동으로 패키지에 포함됩니다.
CodePorting.Wrapper Cs2Python으로 래핑된 MyLibrary
라이브러리를 사용하는 경우는 다음과 같습니다:
from mylibrary import Greeting
greet = Greeting()
message = greet.say_hello("World")
print(message)
보시다시피, 이는 완전한 코드 변환의 경우 사용 예를 정확히 복제합니다. 그러나 Microsoft.CodeAnalysis
코드를 Python으로 변환하거나 그에 상응하는 것을 찾을 필요가 없었습니다.
이제 래핑을 사용하여 C# 코드를 Python에 통합하는 것의 장단점을 살펴보겠습니다.
pip
을 통해 생성된 Wheel 패키지를 설치하고 사용하는 것은 과정이 간단하고 직관적입니다. 이를 통해 사용자는 고급 기술 지식 없이도 프로젝트에 라이브러리의 기능을 쉽게 통합하고 사용할 수 있습니다.C# 라이브러리를 Python에 통합하면 Python 프로젝트에서 기존의 C# 코드를 효과적으로 사용할 수 있습니다. 래핑과 코드 변환 간의 선택은 프로젝트의 특정 요구 사항에 따라 달라집니다. 래핑은 시간과 노력을 최소화하면서 C# 라이브러리를 Python에서 빠르고 쉽게 사용할 수 있게 합니다. 코드 변환은 더 많은 리소스를 필요로 하지만 더 깊은 통합을 제공할 수 있습니다.
적절한 통합 방법 선택은 리소스 사용을 극대화하고 목표를 달성하는 데 도움이 됩니다.