Вопрос

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

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

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

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

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

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

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

А AcquireLock и ReleaseLockМетоды - это тонкие обертки над неуправляемыми PyGILState_Ensure и PyGILState_Release Функции из Python API, и документация для этих API применяется к управляемым версиям.

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

Большинство научных и числовых библиотек Python, использующих C-API CPython (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», поэтому он будет предпочтительнее, если вы хотите полностью интегрировать свой код 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).

от ЖелезоPython 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, однако, с другой стороны, имеет доступ к .net и может быть расширен с помощью C#.Так что, если вы уже используете C#, то Iron Python — это бонус.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top