Вызов Python from.NET

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

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

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

Примечание: IronPython не является вариантом для этого Python-скрипта

6 ответов


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

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


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

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

С этими инструментами, вы


помимо опции COM, вы можете создать экземпляр скрипта Python для сервера xmlrpc - это довольно прозрачно, и вам никогда не придется иметь дело с "xml" на вашем собственном коде.

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

примера SimpleXMLRPCServer в документации Python достаточно для что:

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


Я думаю, вам нужно переоценить ответ Карлоса. См. раздел реализация COM-объектов с Python в книге Марка Хаммонда Python Programming on 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 и использовать команду Run из меню File. "

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

посмотреть здесь потребление Python COM-сервера из .NET


создать COM .dll от a .py скрипт и использовать взаимодействие в коде .NET. Взгляните сюда:http://docs.python.org/faq/windows.html


PythonNet должен помочь с этим. Он позволяет вызывать код python из C#.

более чистый способ-выставить скрипт python через Flask REST API и потребляйте это из своего приложения .NET. Не забудьте поставить аутентификации на месте.