Python 코드에서 C #으로 작성된 일부 .NET 어셈블리에 액세스하고 싶습니다.
약간의 조사에 따르면 두 가지 선택이 있습니다.
- .NET 인터페이스 기능 / 지원이 내장 된 IronPython
- Python .NET 패키지 가있는 Python
두 솔루션 간의 장단점은 무엇입니까?
답변
주로 .NET 프레임 워크를 기반으로하는 코드를 원한다면 IronPython 대 Python.NET을 적극 권장합니다. IronPython은 거의 기본 .NET이므로 다른 .NET 언어와 통합 할 때 훌륭하게 작동합니다.
Python.NET은 .NET의 하나 또는 두 개의 구성 요소를 표준 Python 응용 프로그램에 통합하려는 경우 유용합니다.
IronPython을 사용할 때 눈에 띄는 차이점이 있지만 대부분은 상당히 미묘합니다. Python.NET은 표준 CPython 런타임을 사용하므로이 Wiki 페이지 는 두 구현 간의 차이점에 대한 관련 토론입니다. 가장 큰 차이는 예외 비용에서 발생합니다. 따라서 일부 표준 Python 라이브러리는 구현으로 인해 IronPython에서 제대로 작동하지 않습니다.
답변
Reed Copsey와 Alex Martelli가 제공 한 답변에 동의하면서 GIL (Global Interpreter Lock)이라는 또 다른 차이점을 지적하고 싶습니다. IronPython에는 GIL의 제한이 없지만 CPython은 그렇습니다. 따라서 특정 멀티 코어 시나리오에서와 같이 GIL이 병목 현상이있는 애플리케이션의 경우 IronPython이 Python.NET보다 유리한 것으로 보입니다.
Python.NET 문서에서 :
임 베더에 대한 중요 참고 사항 : Python은 자유 스레드가 아니며 전역 인터프리터 잠금을 사용하여 다중 스레드 응용 프로그램이 Python 인터프리터와 안전하게 상호 작용할 수 있도록합니다. 이에 대한 더 많은 정보는
www.python.org
웹 사이트 의 Python C API 문서에서 확인할 수 있습니다
.관리되는 애플리케이션에 Python을 포함 할 때 C 또는 C ++ 애플리케이션에 Python을 포함 할 때와 동일한 방식으로 GIL을 관리해야합니다.
Python.Runtime
네임 스페이스에서 제공하는 객체 또는 API와 상호 작용하기 전에
호출 코드가PythonEngine.AcquireLock
메서드 를 호출하여 Python 전역 인터프리터 잠금을 획득해야합니다
. 이 규칙의 유일한 예외PythonEngine.Initialize
는 GIL을 획득하지 않고 시작할 때 호출 할 수 있는
메서드입니다.Python API 사용이 끝나면 관리 코드는 해당하는
PythonEngine.ReleaseLock
을 호출 하여 GIL을 릴리스하고 다른 스레드가 Python을 사용하도록 허용 해야합니다
.
AcquireLock
및ReleaseLock
방법은 관리되지 않는 이상 얇은 래퍼PyGILState_Ensure
와
PyGILState_Release
파이썬 API의 기능 및 그 API에 대한 문서는 관리 버전에 적용됩니다.
또 다른 문제는 IDE 지원입니다. CPython은 현재 IronPython보다 더 나은 IDE 지원을 제공 할 것입니다. 따라서 이것이 다른 하나를 선택하는 요인이 될 수 있습니다.
답변
CPython C-API (numpy, scipy, matplotlib, pandas, cython 등)에 의존하는 대부분의 과학 및 숫자 Python 라이브러리는 대부분 CPython에서 작동하므로이 경우 가장 좋은 방법은 pythonnet (다른 이름-Python.NET)입니다. 및 .NET 용 Python). pythonnet과 IronPython 모두 WPF 및 WinForms를 사용할 수 있지만 WxWidgets, PyQt / PySide, GTK, Kivy 등과 같은 CPython GUI 바인딩도 마찬가지입니다.
마지막으로 IronPython은 아직 Python 3을 완전히 지원하지 않습니다.
답변
IronPython은 “.NET 네이티브”이므로 Python 코드를 .NET과 완전히 통합하려는 경우 선호됩니다. Python.NET은 클래식 Python과 함께 작동하므로 Python 코드의 “팔 길이”를 .NET에서 적절하게 유지할 수 있습니다. ( 이 코드 를 사용하면 IronPython 코드에서 CPython 용으로 작성된 확장을 실제로 사용할 수 있으므로 더 이상 차별 조건이 아닙니다.)
답변
IronPython은 Microsoft에서 제공하므로 다른 MSFT 기술과 더 잘 작동 할 것이라고 가정해야하므로 내 직감을 가지고 먼저 사용하겠습니다.
답변
2016 년.
우리 회사에서는 IronPython을 사용했지만 성능에 만족하지 않았기 때문에 (주로 메모리 사용-가비지 수집기가 너무 느림) 표준 Python으로 전환하고 Zeroce-s ICE를 사용하여 .Net과 통합하기로 결정했습니다.
답변
IronPython은 현재 Python 3.6을 지원하지 않습니다 (2.7 만 해당).
에서 IronPython의 3 “아직 제공되지 않습니다 IronPython의 3의 구축합니다.”