18

我有一些用 Python 编写的代码,无法转换为 .NET 语言。我需要从我的 .NET WinForms 应用程序中调用这些函数之一。

现在,我通过将 Python 脚本作为一个单独的进程启动并将参数作为命令行参数传递给它来实现。它有效,但我不太喜欢这种解决方案。我想把它改进成更好的。

.py有没有更好的方法从 .NET 应用程序调用脚本函数?最好的方法是什么?

注意:IronPython 不是此 Python 脚本的选项

4

6 回答 6

10

这可能比启动 Python 进程要多得多,但这里有一个替代解决方案。

您可以将 Python 嵌入到另一个程序中。API 用于 C 和 .NET 的互操作可能会是一个主要的痛苦。如果您想以一种更安全的方式来处理本机 Python API,您可以查看Boost.Python. 在其较少宣传的功能中,它支持嵌入.

使用这些工具,您可以编写一个 C++ 托管 DLL,用于Boost.Python加载 Python 解释器并执行任何 Python 脚本。因此,您可以直接在托管进程中执行任何 Python 代码,而无需使用外部进程和任何形式的 IPC。

编辑:AFAIK,您需要添加到安装过程中的只是部署 Python DLL 和Boost.PythonDLL。

于 2011-07-08T13:18:17.573 回答
5

除了 COM 选项之外,您还可以让您的 Python 脚本实例化一个 xmlrpc 服务器——它非常透明,您永远不必在自己的代码中处理“xml”。

然后,在 .net 端,您只需通过 xmlrpc 连接到您的 python 应用程序 - 如果在 C# 中没有合适的方法,只需在 IronPython 中编写一个客户端函数。

Python 文档中的 SimpleXMLRPCServer 示例就足够了:

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

于 2011-07-08T13:13:51.183 回答
5

我认为您需要重新评估卡洛斯的答案。请参阅 Mark Hammond 的 Win32 上的 Python 编程一书中使用 Python 实现 COM 对象部分。

您应该能够创建一个 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 中打开源文件并使用“文件”菜单中的“运行”命令。“

我认为您需要 Activestate 的 ActivePython 发行版才能做到这一点。

请参阅此问题Consuming Python COM Server from .NET

于 2012-05-23T11:03:15.900 回答
3

它有效,但我不太喜欢这个解决方案,我想将它改进为更好的解决方案。

不,AFAIK 没有更好的解决方案,特别是如果 IronPython 不适合您。因此,在等待脚本迁移到 .NET 或发现有人已经在 .NET 上编写了为您提供类似功能的库之前,您仍然可以将此作为临时解决方法。

于 2011-07-08T12:37:32.623 回答
3

从 .py 脚本创建一个 COM .dll 并在您的 .NET 代码中使用 Interop。看看这里:http ://docs.python.org/faq/windows.html

于 2011-07-08T12:46:16.257 回答
3

PythonNet应该对此有所帮助。它使您能够从 C# 调用 python 代码。

一种更简洁的方法是通过Flask REST API公开 python 脚本并从您的 .NET 应用程序中使用它。不要忘记进行适当的身份验证

于 2018-06-14T23:40:49.173 回答