我有一个运行机器学习算法的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。
答案 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# 服务器。
重构并享受额外的竞争力