Вызовите Python из .NET.

У меня есть код, написанный на Python, который нельзя передать на язык .NET. Мне нужно вызвать одну из этих функций из моего приложения .NET WinForms.

Теперь я делаю это, запуская скрипт Python как отдельный процесс и передавая ему параметры как аргументы командной строки. Он работает, но мне не очень нравится это решение. Я бы хотел улучшить его до лучшего.

Есть ли лучший способ вызвать функцию скрипта .py из приложения .NET? Каков наилучший способ сделать это?

Примечание: IronPython НЕ является вариантом для этого сценария Python

  • Python для .NET «не удалось найти сборку»
  • Как передать обратный вызов python на вызов функции c #
  • Как загрузить C # dll в python?
  • Кто-нибудь использовал SciPy с IronPython?
  • Можем ли мы загрузить pandas DataFrame в .NET ironpython?
  • Можно ли использовать scikit из IronPython?
  • Определенный метод использования NumPy и SciPy от IronPython
  • IronPython против Python .NET
  • 5 Solutions collect form web for “Вызовите Python из .NET.”

    Он работает, но мне не очень нравится это решение, я бы хотел улучшить его до лучшего.

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

    Это может быть намного больше, чем запуск процесса Python, но это альтернативное решение.

    Вы можете вставлять Python в другую программу. API для C и Interop от .NET, вероятно, будет большой болью. Если вы используете более безопасный способ обработки собственного API Python, вы можете посмотреть в Boost.Python , который среди своих менее рекламируемых функций имеет поддержку встраивания .

    С помощью этих инструментов вы можете написать управляемую DLL C ++, которая использует Boost.Python для загрузки интерпретатора Python и выполнения любого скрипта Python. Таким образом, вы можете выполнить любой код Python непосредственно в процессе хостинга, исключая использование внешнего процесса и любой формы IPC.

    Изменить : AFAIK, все, что вам нужно добавить к вашей процедуре установки, – это развертывание DLL Python и библиотеки Boost.Python .

    Помимо опции COM, вы можете сделать свой скрипт Python экземпляром сервера xmlrpc – он достаточно прозрачен, и вам никогда не придется иметь дело с «xml» на свой собственный код.

    Затем, на .net стороне, вы просто подключаетесь к своему приложению python через xmlrpc – если нет подходящего способа сделать это на C #, просто напишите клиентскую функцию в IronPython.

    Пример SimpleXMLRPCServer для документации на Python достаточно для этого:

    http://docs.python.org/library/simplexmlrpcserver.html

    Я думаю, вам нужно переоценить ответ Карлоса. См. Раздел «Реализация COM-объектов с помощью Python» в книге Марка Хаммонда «Программирование на Python» на Win32.

    Вы должны иметь возможность создавать COM-объект, а затем взаимодействовать с ним .Net.

    Из книги будет создан COM-сервер с единственным методом.

     # SimpleCOMServer.py - A sample COM server - almost as small as they come! # # We expose a single method in a Python COM object. class PythonUtilities: _public_methods_ = [ 'SplitString' ] _reg_progid_ = "PythonDemos.Utilities" # NEVER copy the following ID # Use "print pythoncom.CreateGuid()" to make a new one. _reg_clsid_ = "{41E24E95-D45A-11D2-852C-204C4F4F5020}" def SplitString(self, val, item=None): import string if item != None: item = str(item) return string.split(str(val), item) # Add code so that when this script is run by # Python.exe, it self-registers. if __name__=='__main__': print "Registering COM server..." import win32com.server.register win32com.server.register.UseCommandLine(PythonUtilities) 

    В книге далее говорится: «.. вы можете сделать это, выполнив код как обычный скрипт Python. Самый простой способ сделать это – открыть исходный файл в PythonWin и использовать команду« Выполнить »из меню« Файл »».

    Я думаю, вам нужен дистрибутив ActivePython от Activestate, чтобы сделать это.

    См. Этот вопрос Потребление Python COM-сервера от .NET

    Создайте COM-DLL из сценария .py и используйте Interop в коде .NET. Посмотрите здесь: http://docs.python.org/faq/windows.html

    Python - лучший язык программирования в мире.