Подтвердить что ты не робот

IronPython против Python.NET

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

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

  • IronPython с поддержкой/поддержкой интерфейса .NET
  • Python с пакетом Python.NET

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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

При встраивании Python в управляемый приложения, вам необходимо управлять GIL так же, как и вы при встраивании Python в C или С++ приложение.

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

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

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

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

Ответ 3

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

И, наконец, IronPython еще не поддерживает Python 3.

Ответ 4

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

Ответ 5

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

Ответ 6

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

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

Ответ 7

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

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

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

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

Ответ 8

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