La interacción entre c# y Python resuelve perfectamente el problema de Python llamando a OpenCV y otras bibliotecas de terceros y configurando el entorno de Python al distribuir

Sugerencia: después de escribir el artículo, la tabla de contenido se puede generar automáticamente. Cómo generarla puede consultar el documento de ayuda a la derecha


prefacio

Con respecto a cómo C# llama a Python, hay muchas soluciones en Internet, como ironPython, algunas que empaquetan el código de python en exe y otras que llaman a python a través de la clase de proceso, pero estas soluciones tienen más o menos defectos, como ironPython can can Calling bibliotecas de terceros, empaquetadas en exe, funcionando demasiado lento, etc. Este artículo propone principalmente una solución al problema de instalar el entorno python cuando la clase Process llama a python y lo distribuye a otros.


提示:以下是本篇文章正文内容,下面案例可供参考

1. Análisis de problemas

Cómo C# llama a Python, hay una solución muy clásica, que es usar la clase Process de C# para crear un proceso, este proceso en realidad está desarrollado para el intérprete de Python, a través de este proceso se puede llamar perfectamente al código de Python. El principio de esta solución es en realidad equivalente a usar un intérprete de Python para ejecutar una parte del código de Python usted mismo, excepto que el proceso de "usar el intérprete de Python" no se ejecuta manualmente, sino que C# lo ejecuta automáticamente a través de la clase de proceso. Vea el código clave a continuación

            Process P = new Process();
            //当前debug目录路径
            string curPath = System.Environment.CurrentDirectory;
            //需要调用的python代码文件
            string path =  curPath + "\\" + sArgName;
            //python解释器的路径
            P.StartInfo.FileName = curPath + "\\" + "python3\\python.exe";
            //传递的参数,注意,参数数组从0开始索引,第0个参数永远是python代码路径
            //从第一个参数开始是函数的形参
            string sArguments = path;

Aquí hay dos problemas:
primero, cuando se llama a una biblioteca de terceros en código python, ¿cómo sabe el intérprete de python dónde encontrar la ubicación de la biblioteca de terceros?
En segundo lugar, cuando se distribuye a un usuario que no ha instalado Python, ¿cómo se puede evitar que el usuario descargue Python, pero se puede usar directamente?

Dos, la solución

primera pregunta

Si se hace referencia a la tercera biblioteca en el código de Python, el intérprete de Python buscará la biblioteca correspondiente en sus directorios hermanos, variables de entorno y directorios agregados manualmente. Podemos entender esto desde el directorio de instalación de python. La siguiente figura es el directorio de instalación de python del autor.
inserte la descripción de la imagen aquí
Cuando llame a Python.exe, buscará la carpeta de paquetes del sitio correspondiente en la carpeta LIB en el directorio del mismo nivel. Si el tercero -party library se encuentra, se ejecutará con éxito, de lo contrario, informará de un error.

segunda pregunta

Al distribuir a los usuarios, si el usuario no tiene un entorno python instalado, el código que se puede ejecutar en su computadora informará un error porque el módulo correspondiente no se puede encontrar en el lado del usuario. La solución general es instalar un entorno python para los usuarios, pero esto sin duda afectará la experiencia del usuario. La mejor solución es configurar el entorno python en los archivos del proyecto distribuido.
Inspirado en la primera pregunta, el intérprete de python buscará bibliotecas de terceros y otros archivos dependientes en el mismo directorio, luego podemos crear una nueva carpeta de python en el archivo del proyecto y luego configurar el entorno de python en él. La operación específica es muy simple, solo copie todo el contenido de la carpeta donde está instalado el intérprete de python. Por supuesto, en este caso, la carpeta puede ser muy grande, lo que generalmente se debe a que hay muchas bibliotecas de terceros en los paquetes del sitio. Solo necesita mantener las bibliotecas relevantes en los paquetes del sitio al copiar, y eliminar todas las demás irrelevantes para reducir el espacio. Por ejemplo, en la demostración del autor, c # necesita llamar a opencv de python para mostrar imágenes, por lo que opencv debe mantenerse en los paquetes del sitio y la biblioteca numpy servirán. Vea abajo
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí

3. Resultados y código fuente

 private void button2_Click(object sender, EventArgs e)
        {
    
    
            //打开图片文件
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Title = "请选择图片文件";
            ofd.InitialDirectory = @"C:\Users\17116\Desktop";
            ofd.Filter = "图片文件|*.*";
            ofd.ShowDialog();
            url = ofd.FileName;
            string[] strArr = new string[2];//参数列表
            string sArgName = "main.py";//调用的.py文件名
            //strArr[0] = textBox1.Text;
            //strArr[1] = textBox2.Text;
            strArr[0] = url;
            RunpythonScript(sArgName, strArr);//运行python
        }

        public static void RunpythonScript(string sArgName, params string[] teps)
        {
    
    
            Process P = new Process();
            //当前debug目录路径
            string curPath = System.Environment.CurrentDirectory;
            //需要调用的python代码文件
            string path =  curPath + "\\" + sArgName;
            //python解释器的路径
            P.StartInfo.FileName = curPath + "\\" + "python3\\python.exe";
            //传递的参数,注意,参数数组从0开始索引,第0个参数永远是python代码路径
            //从第一个参数开始是函数的形参
            string sArguments = path;
            foreach (string sigter in teps)
            {
    
    
                sArguments += " " + sigter;//传递参数,两次之后为 路径 参数一 参数二
            }
            P.StartInfo.Arguments = sArguments;//启动python需要的命令语句
            P.StartInfo.UseShellExecute = false;
            P.StartInfo.RedirectStandardOutput = true;
            P.StartInfo.RedirectStandardInput = true;
            P.StartInfo.RedirectStandardError = true;
            P.StartInfo.CreateNoWindow = true;
            P.Start();
            P.BeginOutputReadLine();//在应用程序的output流上异步读取数据
            P.OutputDataReceived += new DataReceivedEventHandler(P_OutputDataReceived);//事件触发器,有新的数据就读取
            P.WaitForExit();
        }
        //用于C#和python之间字符串类型数据的传递
        static void P_OutputDataReceived(object sender, DataReceivedEventArgs e)
        {
    
    
            //if (!string.IsNullOrEmpty(e.Data))//如果字符串存在
            //{
    
    
            //    MessageBox.Show(Convert.ToString(e.Data));//显示结果
            //}

        }

código python en main.py

import cv2
import sys

def add(a,b):
    return (float(a) + float(b))

def imgshow(path):
    img = cv2.imread(path)
    cv2.imshow("img",img)
    cv2.waitKey()

imgshow(sys.argv[1])
# print(add(sys.argv[1],sys.argv[2]))

# if __name__ == '__main__':
#     print(add(sys.argv[1],sys.argv[2]))

Haga clic en el botón de selección de imagen en la figura, c# llamará al archivo main.py y mostrará la imagen a través de opencv
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí

Cuatro Resumen

Este artículo llama a python a través de la clase de proceso, puede usar la biblioteca de terceros de python y no necesita instalar el entorno de python al distribuir a los usuarios. Pero todavía hay una deficiencia: el problema de la transmisión de datos de tipos que no son cadenas, como imágenes. Estos son dos procesos diferentes.Cómo cargar los datos de imagen procesados ​​por python directamente en la memoria de c#, en lugar de leer el archivo (esto será muy lento), es la dirección de mejora de seguimiento.
Finalmente, enumeraré algunas ideas para llamar a python desde C# que no han sido probadas:
1. Use la biblioteca Python.NET: Python.NET es una biblioteca para ejecutar código Python en la plataforma .NET Proporciona un enlace entre C# y Python.Interfaz. Puede usar la biblioteca Python.NET para llamar al código Python desde un programa C#.

2. Use Pyjion: Pyjion es un compilador JIT de código abierto que puede compilar código Python en código de máquina .NET. Puede usar Pyjion para llamar al código Python compilado desde un programa C#.
PD: si necesita el código completo, puede descargarlo desde este enlace. Los bloggers también necesitan algunos créditos para descargar recursos. Los interesados ​​​​esperamos brindar más apoyo. Descarga completa del código

Supongo que te gusta

Origin blog.csdn.net/bookshu6/article/details/128283187
Recomendado
Clasificación