IronPython против.Питон .NET
-
19-09-2019 - |
Вопрос
Я хочу получить доступ к некоторым сборкам .NET, написанным на C#, из кода Python.
Небольшое исследование показало, что у меня есть два варианта:
- ЖелезоПитон со встроенной возможностью/поддержкой интерфейса .NET
- Питон с Питон .NET упаковка
Каковы компромиссы между обоими решениями?
Решение
Если вы хотите в основном основывать свой код на платформе .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 пока не предоставлены».
Ironpython похож на C#, в свою очередь, он опирается на статические готовые библиотеки, хотя в отличие от C# является динамическим языком.
Cpython похож на C++, например, Ironpython — динамический язык и имеет доступ к динамическим библиотекам, что, в свою очередь, приводит к необходимости писать все.
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 как неуправляемое приложение.