Phyton NET
Phyton NET
Con PythonNET puedes, por tanto, utilizar tipos de datos .NET en Python. Para instalar
pythonnet ejecuta:
La sentencia import clr importa la interfaz para interactuar con el CLR (Common
Language Runtime) de .NET. A partir de aquí podemos utilizar los tipos de datos
de .NET en Python.
Aparentemente da igual usar una variable u otra, pero los datos almacenados en
estas variables son totalmente diferentes:
>>> len(text1)
10
>>> len(text2)
Traceback (most recent call last):
File "", line 1, in
TypeError: object of type 'String' has no len()
>>> text2.Length
10
No obstante, PythonNET implementa el método __dir__ para todos los objetos
de .NET, lo que nos facilita el desarrollo de aplicaciones cuando no sabemos
exactamente que atributos de un objeto tenemos que utilizar:
>>> text2.__dir__()
['__repr__', '__hash__', '__call__', '__str__', '__lt__', '__le__',
'__eq__', '__ne__', '__gt__', '__ge__', '__iter__', '__init__',
'__getitem__', '__setitem__', '__delitem__',
'__new__', '__doc__', '__module__', 'GetHashCode', 'get_Chars',
'Replace', 'Compare', 'Intern', 'Copy', 'ToLowerInvariant',
'LastIndexOf', 'Normalize', 'Format', 'Equals',
'ToLower', 'Concat', 'GetTypeCode', 'Trim', 'Split', 'ToCharArray',
'TrimEnd', 'Substring', 'op_Inequality', 'ToUpperInvariant',
'ToUpper', 'ToString', 'EndsWith', 'Length',
'IsNullOrWhiteSpace', 'LastIndexOfAny', 'CopyTo', 'IsNormalized',
'CompareTo', 'Clone', 'IsNullOrEmpty', 'PadLeft', 'IndexOfAny',
'op_Equality', 'Empty', 'GetEnumerator',
'get_Length', 'PadRight', 'Join', 'Insert', 'StartsWith', 'TrimStart',
'IndexOf', 'Contains', 'Remove', 'IsInterned', 'CompareOrdinal',
'__overloads__', 'Overloads', 'GetType',
'Finalize', 'MemberwiseClone', 'ReferenceEquals', '__getattribute__',
'__setattr__', '__delattr__', '__reduce_ex__', '__reduce__',
'__subclasshook__', '__init_subclass__',
'__format__', '__sizeof__', '__dir__', '__class__']
Como puedes observar, uno de los elementos de la lista devuelta por text2.__dir__()
es Length.
Puede parecer que esto carece de utilidad pero gracias a PythonNET puedes crear
aplicaciones Python cuya interfaz gráfica está hecha en .NET.
Has leido bien, puedes crear una interfaz gráfica con Visual Studio arrastrando y
soltando, compilarla como librería .dll y scriptearla con Python.
Por ejemplo, en visual studio puedes crear un formulario con un botón, y con python
programar lo que sucede al hacer click en dicho botón. Suena bien, ¿verdad? Si es así
continúa leyendo
Vamos a crear un pequeño ejemplo para que veas lo que es posible hacer:
Fíjate en el IDE: Lo primero que vemos es un formulario vacío cuyo título es Form1. A
su izquierda y en vertical puede leerse el texto Cuadro de herramientas (si haces click
en él se abrirá un menú que permite añadir widgets/controles al formulario).
Cambia la propiedades Text de Form1 para que el título del formulario sea "Ejemplo":
Observa que en la imagen anterior está seleccionado el formulario, de modo que las
propiedades mostradas en el menú de propiedades son las del formulario Form1 (con
título "Ejemplo").
Al cambiar Text y presionar enter se habrá actualizado el texto del botón Button1:
Aunque hemos cambiado el texto del botón a "Saludar" yo sigo refiriendome a él como
Button1. Esto es porque el texto del botón no es su identificador, es decir, Button1
sigue siendo el nombre de la variable que apunta al botón en el código fuente.
Si el formulario tuviese mas widgets habría que hacer que todos sean públicos si
queremos manipularlos en el script python.
El progreso de la compilación se puede observar en la parte inferior del IDE. Una vez
finalizada la compilación el IDE lo notifica:
Ahora ve al Explorador de solucines (en la parte superior de la derecha del IDE), haz
click derecho en "ejemplo" y a continuación en Abrir carpeta en el Explorador de
archivos:
Se abrirá la carpeta que contine el proyecto. Dentro del proyecto "ejemplo" navega al
subdirectorio bin\x64\Release el archivo ejemplo.dll es la librería que contiene el
formulario con un botón que hemos creado anteriormente.
NOTA: El archivo ejemplo.dll es multiplataforma, es decir, aunque lo has compilado en
windows con visual studio puedes utilizarlo en linux/mono (no tienes que recompilar
para utilizarlo en linux).
import clr
clr.AddReference('ejemplo')
app = Form1()
Application.Run(app)
Ahora que comprendemos el código vamos a darle funcionalidad al botón. Define una
función saludar:
Esta función toma dos argumentos: sender y e, que son necesarios para utilizar la
función como manejador de eventos.
Para convertir la función saludar en un manejador del evento click del botón:
app.boton_saludar.Click += saludar
import clr
clr.AddReference('ejemplo')
app = Form1()
app.boton_saludar.Click += saludar
Application.Run(app)
Hemos creado una interfaz gráfica en visual studio y nuestro programa python es capaz
de utilizarla y darle funcionalidad!!
import clr
clr.AddReference('ejemplo')
class App(Form1):
def __init__(self):
super().__init__(self)
self.boton_saludar.Click += self.saludar
app = App()
Application.Run(app)
DISTRIBUCIÓN DE APLICACIONES
Ahora que has creado tu primera aplicación con Python.NET te preguntarás si es posible
convertir tu aplicación en un ejecutable (.exe). Puedes hacerlo como de costumbre
con PyInstaller.
Si quires crear un standalone, es decir, que tu programa sea un solo archivo, y además
quieres ocultar la consola de comandos tienes que ejecutar:
Pero antes de compilar de esta forma tienes que hacer una pequeña modificación en el
programa:
if hasattr(sys, '_MEIPASS'):
os.chdir(sys._MEIPASS)
Si compilases la aplicación sin --onefile no tendrías que hacer nada de esto. Quería
aclararlo porque en su día me costó mucho encontrar esta información.
ESPERO QUE HAYAS DISFRUTADO LEYENDO ESTE ARTÍCULO. Tan
pronto como pueda seguiré escribiendo sobre PythonNET.
A continuación te dejo unos enlaces a dos de los programas que hice con pythonnet, por
si quieres echarles un vistazo:
Para Easy PDF Two Sided la interfaz fue creada en Visual Studio y la funcionalidad fue
programada en python gracias a pythonnet.
Las primeras versiones de LoL Absent utilizaban PythonNet pero posteriormente migré
la aplicación a IronPython, ya que el código de una aplicación pythonnet es código
válido para una aplicación ironpython (teniendo en cuenta que ironpython es python2).
La razón por la que cambié a IronPython es que PyInstaller frecuentemente crea
ejecutables que son detectados como virus