我想将Python与C#集成。我发现有两种方法使用进程间通信和IronPython
进程间通信需要Python.exe安装在所有客户机上,所以不是一个可行的解决方案。在
我们开始使用IronPython,但目前它只支持2.7python版本。我们使用的是3.7版本。在
我们尝试使用IronPython的以下代码:
private void BtnJsonPy_Click(object sender, EventArgs e)
{
// 1. Create Engine
var engine = Python.CreateEngine();
//2. Provide script and arguments
var script = @"C:\Users\user\source\path\repos\SamplePy\SamplePy2\SamplePy2.py"; // provide full path
var source = engine.CreateScriptSourceFromFile(script);
// dummy parameters to send Python script
int x = 3;
int y = 4;
var argv = new List<string>();
argv.Add("");
argv.Add(x.ToString());
argv.Add(y.ToString());
engine.GetSysModule().SetVariable("argv", argv);
//3. redirect output
var eIO = engine.Runtime.IO;
var errors = new MemoryStream();
eIO.SetErrorOutput(errors, Encoding.Default);
var results = new MemoryStream();
eIO.SetOutput(results, Encoding.Default);
//4. Execute script
var scope = engine.CreateScope();
var lib = new[]
{
"C:\\Users\\user\\source\\repos\\SamplePy\\CallingWinForms\\Lib",
"C:\\Users\\user\\source\\repos\\SamplePy\\packages\\IronPython.2.7.9\\lib",
"C:\\Users\\user\\source\\repos\\SamplePy\\packages\\IronPython.2.7.9",
"C:\\Users\\user\\source\\repos\\SamplePy\\packages\\IronPython.StdLib.2.7.9"
//"C:\\Users\\user\\AppData\\Local\\Programs\\Python\\Python37 - 32\\Lib",
//"C:\\Users\\user\\AppData\\Local\\Programs\\Python\\Python37-32\\python.exe",
//"C:\\Users\\user\\AppData\\Local\\Programs\\Python\\Python37 - 32",
//"C:\\Users\\user\\AppData\\Local\\Programs\\Python\\Python37-32\\DLLs"
};
engine.SetSearchPaths(lib);
engine.ExecuteFile(script, scope);
//source.Execute(scope);
//5. Display output
string str(byte[] x1) => Encoding.Default.GetString(x1);
Console.WriteLine("Errrors");
Console.WriteLine(str(errors.ToArray()));
Console.WriteLine();
Console.WriteLine("Results");
Console.WriteLine(str(results.ToArray()));
lblAns.Text = str(results.ToArray());
}
有时问题是,要进行繁重的机器学习编程,我们需要添加“模块”。这些模块将依赖于其他模块。这增加了第4点,执行部分代码的脚本,因为这里必须给出该模块的更多数据路径var lib = new[]
,而且有些模块也不受Iron Python的支持(例如,涉及OCR操作的模块等)
由于这些限制,我找到了Pythonnet,它也有助于将.net应用程序与Python集成。但我对它还不熟悉,所以想知道一些实现相同功能的想法,以及可用的代码示例,它是否可行或建议与Python3.7一起使用
我检查了设置Pythonnet最初是很麻烦的,所以需要帮助或如何设置相同的步骤。还想知道将来IronPython是否也支持Python3.X。在
我不熟悉IronPython,但我经常使用pythonnet来达到相同的目的—将Python与C#集成,所以我可以详细介绍一下。在
使用pythonnet的优点是可以使用所有CPython包(numpy、scipy、pandas、Theano、Keras、scikit learn等),但避免了调用的开销python.exe作为单独的过程(pythonnet通过装载工作pythonXY.dll在你的过程中)。在
请注意,pythonnet还要求有独立的Python可用,但是您可以使用Embeddable Python package,它非常轻量级,可以与应用程序一起分发。在
pythonnet支持python3.7,但发布的NuGet包仅适用于python3.5。要获取pythonnet for Python 3.7,有几种选择:
重要注意事项:pythonnet版本必须与您的Python版本和位匹配。例如,如果您使用的是python3.7 32位,请下载pythonnet-2.4.0-cp37-cp37m-win32.whl。如果您的Python是64位的,请下载pythonnet-2.4.0-cp37-cp37m-win_amd64.whl。您的C项目平台目标也必须匹配(x86代表32位,x64代表64位)。在
使用pythonnet(在windows7上用pythonnet 3.7.4和pythonnetnubget从latest build artifacts测试)得到的代码示例具有与您发布的内容相似的功能:
在SamplePy.py公司名称:
^{pr2}$相关问题 更多 >
编程相关推荐