Вызовите 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
Ответ 5
Создайте COM-DLL из .py script и используйте Interop в вашем коде .NET.
Посмотрите здесь: http://docs.python.org/faq/windows.html