Установить IronPython и Python.NET


Я хочу получить доступ к некоторым сборкам .NET, написанным на C# из кода Python.

небольшое исследование показало, что у меня есть два варианта:

  • IronPython С возможностью/поддержкой интерфейса .NET встроенный
  • Python с Python .NET package

каковы компромиссы между двумя решениями?

10 72

10 ответов:

Если вы хотите в основном основывать свой код на платформе .NET framework, я настоятельно рекомендую IronPython vs Python.NET. IronPython в значительной степени является родным .NET - поэтому он просто отлично работает при интеграции с другими языками .NET.

Python.NET хорошо, если вы хотите просто интегрировать один или два компонента из .NET в стандартное приложение python.

есть заметные различия при использовании IronPython-но большинство из них довольно тонкие. Python.NET использует стандартный CPython runtime, so этой странице соответствующее обсуждение различий между двумя реализациями. Самые большие различия возникают в стоимости исключений - поэтому некоторые стандартные библиотеки python не работают так же хорошо в IronPython из-за их реализации.

соглашаясь с ответами, данными Ридом Копси и Алексом Мартелли, я хотел бы отметить еще одно отличие - глобальный замок интерпретатора (GIL). Хотя IronPython не имеет ограничений GIL, CPython делает это - так что, похоже, что для тех приложений, где Gil является узким местом, скажем, в некоторых многоядерных сценариях, IronPython имеет преимущество перед Python.NET.

от Python.NET документация:

важно Примечание для embedders: Python не свободнопоточный и использует глобальную блокировка интерпретатора для разрешения многопоточные приложения к безопасное взаимодействие с Python переводчик. Гораздо больше информации об этом можно узнать в Python C API документация по www.python.org сайт.

при встраивании Python в управляемый применение, вы должны управлять Гил точно так же, как и вы когда встраивание Python в C или C++ приложение.

перед взаимодействием с любым из объекты или API, предоставляемые Python.Runtime пространство имен, назвав код должно быть, приобрел Python global блокировка интерпретатора путем вызова PythonEngine.AcquireLock метод. Этот единственным исключением из этого правила является PythonEngine.Initialize метод, который может быть вызван при запуске без приобретя Гил.

по завершении использования API Python, управляемый код должен вызывать соответствующий PythonEngine.ReleaseLock для выхода GIL и позволяют использовать другие потоки Питон.

The AcquireLock и ReleaseLock методы-это тонкие обертки поверх неуправляемый PyGILState_Ensure и PyGILState_Release функции API Python и документация для эти API применяются к управляемым версии.

еще одна проблема-поддержка IDE. CPython, вероятно, имеет лучшую поддержку IDE в настоящее время, чем IronPython - так что это может быть фактором в выборе одного над другим.

большинство научных и числовых библиотек Python, которые полагаются на CPython C-API (numpy, scipy, matplotlib, pandas, cython и т. д.) работают в основном под CPython, так что в этом случае ваш лучший выбор-pythonnet (другие имена - Python.NET и Python для .NET). То же самое верно для Привязок графического интерфейса CPython, таких как WxWidgets, PyQt/PySide, GTK, Kivy и т. д., хотя и pythonnet и IronPython могут использовать WPF и WinForms.

и, наконец, IronPython не полностью поддерживает Python 3 еще.

IronPython является ".NET-native" -- поэтому будет предпочтительнее, если вы хотите полностью интегрировать свой код Python с .NET; Python.NET работает с классическим Python, поэтому он позволяет вам держать код Python "на расстоянии вытянутой руки" от .NET. (Обратите внимание, что с код вы можете фактически использовать расширения, написанные для CPython из вашего кода IronPython, так что это больше не является дискриминационным условием).

IronPython исходит от Microsoft, поэтому я бы пошел с моим кишечником и использовал его первым, так как вы должны предположить, что он будет играть лучше с другими технологиями MSFT.

Что касается 2016 года.

в моей компании мы использовали IronPython, но мы не были удовлетворены производительностью (в основном использование памяти - сборщик мусора был слишком медленным), поэтому мы решили перейти на стандартный Python и интегрировать его с .Net с помощью ZEROCE-s ICE.

IronPython, в настоящее время, не поддерживает Python 3.6 (только 2.7)

с IronPython 3"сборки IronPython 3 пока не предусмотрены."

  1. Ironpython похож на C#, в свою очередь, он опирается на статические готовые библиотеки, в то время как в отличие от C# является динамическим языком.

  2. Cpython похож на C++ как Ironpython является динамическим языком и имеет доступ к динамическим библиотекам, что, в свою очередь, приводит к тому, что его заставляют писать все.

  3. Ironpython быстрее, чем C# в некоторых областях, но не быстрее, чем Cpython, однако вы можете связать Ironpython с любым языком, таким образом, над приходом проблемы, но опять же вы можете сделать то же самое с Cpython.

забавный, простой и мощный язык независимо от того, что вы выберете!

Iron Python в основном Python 2.7 с интегрированной поддержкой .net он, вероятно, никогда не будет поддерживать Python 3. Он проигрывает в библиотеках C и Python, однако на стороне twist имеет доступ к .net и может быть расширен с помощью C#. Так что если вы используете C# уже тогда железный питон-это бонус.

Я в основном предпочитаю Python для .NET, потому что IronPython компилируется как управляемый код, который можно легко декомпилировать (что я больше всего ненавижу), но с py2exe или pyinstaller вы можете скомпилировать Python с NET module как неуправляемое приложение.