是否可以将带有许多包的 Python 脚本嵌入到 C# 中?

Posted

技术标签:

【中文标题】是否可以将带有许多包的 Python 脚本嵌入到 C# 中?【英文标题】:Is it possible to embed Python script with many packages to C#? 【发布时间】:2021-07-29 20:17:19 【问题描述】:

我需要在 C# 应用程序中嵌入一些 python 脚本。问题是这些脚本使用了许多包,如 numpy、openCV 等。我读过 Ironpython 可以处理这种嵌入,但它仅限于没有任何包的纯 Python 代码。将这样的脚本作为 C# 应用程序中的对象会很棒,所以我每次需要时都会调用它,而无需冗余输入/输出操作。时间和性能至关重要,因为操作是在 Python 脚本上对从摄像头捕获的数据执行的。

有什么办法吗?

【问题讨论】:

【参考方案1】:
using System;
using System.Diagnostics;
using System.IO;
using System.Threading.Tasks;

namespace App

    public  class Test
    
        

        private void runScript(object sender, EventArgs e)
        
            run_cmd();
        

        private void run_cmd()
        

            string fileName = @"C:\app.py";

            Process p = new Process();
            p.StartInfo = new ProcessStartInfo(@"C:\path\python.exe", fileName)
            
                RedirectStandardOutput = true,
                UseShellExecute = false,
                CreateNoWindow = true
            ;
            p.Start();

            string output = p.StandardOutput.ReadToEnd();
            p.WaitForExit();

            Console.WriteLine(output);

            Console.ReadLine();

        
    

【讨论】:

好的,但是打开的时间很长。你现在能告诉我现在是否可以从那个 python 脚本中获取一些数据吗?我需要做什么? 我不确定,但是你为什么不把你的模型变成一个 Api 然后托管它并通过 C# 向模型端点发送请求,这比做所有这些要容易得多。跨度> 我并不精通 C#。我有一个任务来包装我的脚本,以便其他人可以在 WPF 中加载它。我还有一个问题。有没有办法加载一次python(因为加载时间来查看脚本结果非常大)然后更快地运行特定的脚本? 是的,只需将调用可执行文件的代码放在一个固定块中,而不是每次调用每个脚本时。【参考方案2】:

如果您需要 Python 脚本与 .NET 对象交互,您可以查看 Python.NET 包。

using Python.Runtime;

class Test


    void RunPython()
    
        using (Py.GIL())
        
            using (var scope = Py.CreateScope())
            
                var scriptFileName = "myscript.py";
                var compiledFile = PythonEngine.Compile(File.ReadAllText(scriptFileName), scriptFileName);

                scope.Execute(compiledFile); // can be compiled once, executed  multiple times.
            
        
    

您可以使用如下代码将命名对象传递给 Python 引擎:

scope.Set("person", pyPerson);

您可以在此处找到更多示例,包括如何访问 .NET 对象的示例:

http://pythonnet.github.io/

使用 IronPython 是另一种可能性,但它支持 Python 2.7 语法并且与某些 Python 库不完全兼容。

【讨论】:

以上是关于是否可以将带有许多包的 Python 脚本嵌入到 C# 中?的主要内容,如果未能解决你的问题,请参考以下文章

是否有 Python 的“安全”子集可用作嵌入式脚本语言?

将 python3 包添加到 Buildroot

Linux 上固件包的用途和用途

如何将数组从 C 传递到嵌入式 python 脚本

将 Python 嵌入到 C++ 应用程序中,无论是不是安装了 Python(在 Windows 上)

是否可以将 python 子进程的输出实时流式传输到网页?