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

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

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

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

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

Ответ 1

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

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

Ответ 2

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

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

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

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

Ответ 3

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

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

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

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

Ответ 4

Думаю, вам нужно переоценить ответ Карлоса. См. Раздел "Реализация 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 script. Самый простой способ сделать это - открыть исходный файл в PythonWin и использовать команду" Выполнить "из файла меню."

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

См. этот вопрос Потребление Python COM Server с .NET