Python 코드에서 C #으로 작성된 일부 .NET 어셈블리에 액세스하고 싶습니다.
약간의 조사에 따르면 두 가지 선택이 있습니다.
- .NET 인터페이스 기능 / 지원이 내장 된 IronPython
- Python .NET 패키지 가있는 Python
두 솔루션 간의 장단점은 무엇입니까?
Python 코드에서 C #으로 작성된 일부 .NET 어셈블리에 액세스하고 싶습니다.
약간의 조사에 따르면 두 가지 선택이 있습니다.
두 솔루션 간의 장단점은 무엇입니까?
답변:
주로 .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은 Microsoft에서 제공하므로 다른 MSFT 기술과 더 잘 작동 할 것이라고 가정해야하므로 내 직감을 가지고 먼저 사용하겠습니다.
2016 년.
우리 회사에서는 IronPython을 사용했지만 성능에 만족하지 않았기 때문에 (주로 메모리 사용-가비지 수집기가 너무 느림) 표준 Python으로 전환하고 Zeroce-s ICE를 사용하여 .Net과 통합하기로 결정했습니다.
IronPython은 현재 Python 3.6을 지원하지 않습니다 (2.7 만 해당).
에서 IronPython의 3 "아직 제공되지 않습니다 IronPython의 3의 구축합니다."
Ironpython은 C #과 비슷하지만 C #은 동적 언어와 달리 사전 빌드 된 정적 라이브러리에 의존합니다.
Cpython은 Ironpython이 동적 언어이고 동적 라이브러리에 액세스 할 수있는 것처럼 C ++과 유사합니다. 이는 결국 모든 것을 작성하도록 강제됩니다.
Ironpython은 특정 영역에서 C #보다 빠르지 만 Cpython보다 빠르지는 않지만 Ironpython을 모든 언어에 연결할 수 있으므로 다가오는 문제를 해결할 수 있지만 다시 Cpython으로 동일한 작업을 수행 할 수 있습니다.
무엇을 선택하든 재미 있고 간단하며 강력한 언어!
Iron Python은 기본적으로 통합 된 .net 지원이 포함 된 Python 2.7입니다. 아마도 Python 3을 지원하지 않을 것입니다. C 및 Python 라이브러리에서 손실되지만, 트위스트 측면에서는 .net에 액세스 할 수 있으며 C #으로 확장 할 수 있습니다. 따라서 이미 C #을 사용하고 있다면 Iron Python은 보너스입니다.