csharp-pythonnet

Integrar de Python con C# con Python.NET

Python.NET es una biblioteca que proporciona interoperabilidad entre Python y C# en aplicaciones .NET.

Con Python.NET, podemos invocar fácilmente código Python desde C#, y utilizar bibliotecas de Python y acceder a los recursos del ecosistema Python directamente en aplicaciones .NET.

Esta capacidad es especialmente útil para integrar funcionalidades avanzadas de Python, como machine learning y análisis de datos, en aplicaciones desarrolladas con .NET.

Características de Python.NET,

  • Interoperabilidad Completa: Permite la llamada de código Python desde C#, y viceversa, facilitando la integración de ambas tecnologías.
  • Acceso a Bibliotecas Python: Permite utilizar directamente bibliotecas Python en aplicaciones .NET.
  • Soporte para Tipos de Datos: Maneja la conversión entre tipos de datos de Python y C# automáticamente.
  • Ejecución de Scripts Python: Permite ejecutar scripts Python y utilizar sus resultados en aplicaciones C#.

La interoperabilidad puede tener un impacto en el rendimiento, especialmente si se realizan llamadas frecuentes entre C# y Python. Es decir, no os esperéis programas rápidos (Python es muy lento, y con el interop aún peor).

Para más información, documentación y ejemplos adicionales, visita el repositorio oficial de Python.NET en GitHub. Aquí encontrarás todos los recursos necesarios para comenzar a integrar Python en tus aplicaciones C#.

Instalación de Python.NET

Para agregar Python.NET a tu proyecto, utiliza el administrador de paquetes NuGet. Abre la terminal o la consola del administrador de paquetes de Visual Studio y ejecuta el siguiente comando:

Install-Package Pythonnet

O bien, mediante la interfaz de NuGet en Visual Studio, busca Pythonnet e instálalo en tu proyecto.

Cómo Usar Python.NET

Configuración Inicial

Para comenzar a usar Python.NET en tu proyecto C#, necesitas inicializar el entorno de Python y configurar el intérprete Python. Aquí hay un ejemplo de cómo hacerlo:

using Python.Runtime;

// sustituir por la version de Python que tengáis instalada
Runtime.PythonDLL = "python312.dll";

PythonEngine.Initialize();
using (Py.GIL())
{
    dynamic np = Py.Import("numpy");
    Console.WriteLine(np.cos(np.pi * 2));

    dynamic sin = np.sin;
    Console.WriteLine(sin(5));

    double c = (double)(np.cos(5) + sin(5));
    Console.WriteLine(c);

    dynamic a = np.array(new List<float> { 1, 2, 3 });
    Console.WriteLine(a.dtype);

    dynamic b = np.array(new List<float> { 6, 5, 4 }, dtype: np.int32);
    Console.WriteLine(b.dtype);

    Console.WriteLine(a * b);
    Console.ReadKey();
}

En este ejemplo, inicializamos el entorno de Python, importamos la biblioteca NumPy, creamos un array y mostramos su contenido en la consola.

Llamando a Funciones Python desde C#

Puedes llamar a funciones definidas en scripts Python desde C# utilizando Python.NET. Aquí hay un ejemplo de cómo hacerlo:

  1. Definir una función en un script Python. Creamos un fichero en la solución del proyecto, por ejemplo example.py. Ahí metemos nuestras funciones.
def add(a, b):
    return a + b

En Visual Studio / propiedades del fichero, marcamos la opción “Copy to Output Directory” como “Copy Always”.

  1. Llamar a la función desde C#: Ahora podemos llamar nuestra función importando el módulo que hemos creado.
using Python.Runtime;

Runtime.PythonDLL = "python312.dll";

PythonEngine.Initialize();


using (Py.GIL()) // Adquirir el GIL
{
    dynamic pyScript = Py.Import("example");
    dynamic result = pyScript.add(10, 20);
    Console.WriteLine($"Resultado de la suma: {result}");
}

En este ejemplo, importamos el script Python y llamamos a la función add pasando dos argumentos. El resultado se muestra en la consola.