Вызов 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 достаточно для что:
Я думаю, вам нужно переоценить ответ Карлоса. См. раздел реализация 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. Не забудьте поставить аутентификации на месте.