Python和C#之间的通信

时间:2017-03-21 22:27:49

标签: c# python .net rpc python.net

我有一个运行机器学习算法的Python后端。我想为Excel插件(C#)和网站使用相同的后端。我希望两个接口都将我的训练数据(数组中数千行数)发送到同一个Python应用程序,并以另一个数组的形式检索结果,最多可达几千行。

该网站将从SQL数据库中获取数据并将该数据发送到Python,而Excel插件将获取当前工作表中的数据并将该数据发送到Python。我需要能够在继续处理数据之前在Python中创建numpy数组。请注意,该网站将在Python应用程序所在的同一台机器上运行。我仍然没有决定用什么来编写网站代码,但我倾向于Node.js。

我做了一些研究,发现了一些选择:

1- Named pipes
2- Sockets
3- RPC server such as gRPC or XML-RPC.
4- Writing the data to a file and reading it back in Python
5- Web Service

注意:我需要Python"服务器"有状态并保持会话在调用之间运行。所以我需要运行一种守护进程,等待呼叫。

您会向专家推荐哪一个?为什么?我需要灵活处理几个参数以及大数字数组。使用IronPython不是一个选项,因为我在Python上运行Keras,显然不支持IronPython。

6 个答案:

答案 0 :(得分:1)

您可以使用Python for .NET (Python.NET)。它可能需要对您的代码进行一些更改,但是一旦一切状况良好,它应该可以很好地工作。

Python.NET允许CPython和CLR之间的双向通信。

答案 1 :(得分:0)

我遇到了同样的问题,并且似乎以命名管道结尾。 Here是一个很好的示例,说明如何设置它以使用C#=> Python,并假设C#是服务器。 它可以使用相同的方式进行回复,也可以使用Python.net直接通过CLR进行调用,如here所示。我用后者。

答案 2 :(得分:0)

我最近有同样的问题。 我使用命名管道将数据从python传输到我的c#服务器,希望对您有所帮助。

Python:

$(document).on("change", ".js-selector", function() {

    var options = {!! json_encode($salaries) !!};

    var data = $.map(options, function (value, key) {
        return {id: key, text: value};
    });

    $("#salary_list").empty().select2({
        data: data
    });

})

要使此代码正常工作,您需要安装pywin32(最好的选择是从二进制文件):https://github.com/mhammond/pywin32

C#服务器:

import win32pipe, win32file

class PipeServer():
    def __init__(self, pipeName):
        self.pipe = win32pipe.CreateNamedPipe(
        r'\\.\pipe\\'+pipeName,
        win32pipe.PIPE_ACCESS_OUTBOUND,
        win32pipe.PIPE_TYPE_MESSAGE | win32pipe.PIPE_READMODE_MESSAGE | win32pipe.PIPE_WAIT,
        1, 65536, 65536,
        0,
        None)

    #Carefull, this blocks until a connection is established
    def connect(self):
        win32pipe.ConnectNamedPipe(self.pipe, None)

    #Message without tailing '\n'
    def write(self, message):
        win32file.WriteFile(self.pipe, message.encode()+b'\n')

    def close(self):
        win32file.CloseHandle(self.pipe)


t = PipeServer("CSServer")
t.connect()
t.write("Hello from Python :)")
t.write("Closing now...")
t.close()

答案 3 :(得分:0)

让我以示例代码的形式给你一个简洁快速的食谱。

基本上有两种方法可以在 C#(或 C# winform 应用程序或 gui 或类似的东西)后端绑定 python。

方法 1:Iron Python。在这种方法中,您在 Visual Studio 中安装了一个名为 IronPython 的 .net 包。我不喜欢这个,因为假设您的机器学习模型使用 keras 或许多其他库。让您准备好安装并在 IronPython 中工作将是另一个任务。最重要的是,它不如您常见的虚拟环境或 conda 环境。

方法 2:(好方法):在 C# 中创建一个自定义进程,它从您的 GUI 中获取参数,知道脚本和 python 环境的路径。使用所有这些东西,它会完全按照您在终端中调用它的方式调用您的 Python 代码并将参数传递给它。

现在是美味的示例代码(我使用了这个简单的技巧,它总是有助于使我的黑屏 python 东西在 C# 应用程序的封面上看起来很好)。

Python 部分

import sys
a = sys.argv[1]
b = sys.argv[2] 
print("The Sum = ", float(a)+float(b))

C# 部分 所以这是您需要在应用程序中的 sum 按钮的点击事件上调用的 python 进程/函数

static void PythonProcess()
        {
            //1) Create Process Info
            var psi = new ProcessStartInfo();
            
            //Conda Env Path
            psi.FileName = @"C:\Users\jd\.conda\pkgs\py\python.exe";

            //2) Provide Script and the Arguments
            var script = @"C:\Users\jd\Desktop\script.py";
            var a = "15";
            var b = "18";

            psi.Arguments = $"\"{script}\" \"{a}\" \"{b}\"";

            //3) Process Configuration
            psi.UseShellExecute = false; 
            psi.CreateNoWindow = true;
            psi.RedirectStandardOutput = true;
            psi.RedirectStandardError = true;

            //4) Execute Process and get Output.
            var errors = "";
            var results = "";

            using(var process = Process.Start(psi))
            {
                errors = process.StandardError.ReadToEnd();
                results = process.StandardOutput.ReadToEnd();
            }

            //5) Display Output
            Console.WriteLine("ERRORS: ");
            Console.WriteLine(errors);
            Console.WriteLine();
            Console.WriteLine("RESULTS: ");
            Console.WriteLine(results);
        }

答案 4 :(得分:0)

铁蟒会让你的生活变得轻松吗?不要解决它。使用它。

尝试在您的 Ironpython 实例和您的 python 实例之间设置一个 api。对其进行测试并解决任何意外错误。重试或(最好在文件夹中加时间戳)记录以防出错(考虑到 ironpython 是 python 2.7,可能会发生这种情况)与重构。

重构并享受额外的竞争力

答案 5 :(得分:0)

铁蟒会让你的生活变得轻松吗?不要解决它。使用它。

尝试在您的 Ironpython 实例和您的 python 实例之间设置一个 api。对其进行测试并解决任何意外错误。在重构时重试或(最好在文件夹中加时间戳)记录以防出错(考虑到 ironpython 是 python 2.7 可能会发生这种情况)。最好使用专用(或您的一部分)服务器来使用您的 python 和 numpy 将其传输回您的 c# 服务器。

重构并享受额外的竞争力