Creacion de un servidor COM desde Python

Estándar

Antes que nada… que es COM? COM es el acrónimo de Component Object Model (Modelo de Objeto Componente) con lo cual se pueden crear objetos desde un lenguaje y poder utilizarlos en otro distinto en que fueron creados.

Entonces, en este ejemplo se muestra como crear un objeto COM desde Python para poder utilizarlo desde VBA/Excel. Creamos un archivo llamado “miservidorcom.py” y escribimos en el:


import sys
import pythoncom

class interprete_python:
_public_methods_ = ["Evaluar"] #metodos a exportar por el servidor COM
_public_attrs_ = ["Version"] #atributos a exportar por el servidor COM
_readonly_attrs_ = _public_attrs_ #atributos de solo lectura
_reg_progid_ = "interprete_python" #nombre para crear el objeto COM

#asignamos el id de clase por medio de la funcion CreateGuid
_reg_clsid_ = pythoncom.CreateGuid()

#constructor, seteo de atributos
def __init__(self):
self.Version = sys.version

#evalua una expresion python y devuelve su resultado
def Evaluar(self, expresion):
return eval(expresion)

#Codigo para registrar el script en caso de ser ejecutado por linea de comando por python.exe
if __name__ == "__main__":
import win32com.server.register
print sys.argv
win32com.server.register.UseCommandLine(interprete_python)
raw_input("\nServidor COM instalado!")

Antes de poder utilizar el objeto COM en VBA/Excel, hay que registrarlo con la siguiente instruccion desde la linea de comando:


python miservidorcom.py --register

Después de haber registrado el servidor COM, ya podemos invocarlo desde VBA/Excel de la siguiente forma:


Option Explicit

Sub Main()
Dim Python As Object
Dim Version As String
Dim Expresion As String
Dim Resultado As String

' Creo el objeto Python exportado por el Servidor COM:
Set Python = CreateObject("interprete_python")

' Obtengo un atributo del objeto python:
Version = Python.Version
MsgBox Version, , "Versión de Python:"

Do
Expresion = InputBox("Ingrese una expresión python para ser evaluada", "Ejemplo COM", "1+2")
If Expresion = "" Then Exit Sub
' Llamo al método del objeto python:
Resultado = Python.Evaluar(Expresion)
MsgBox Resultado, , "Resultado:"
Loop
End Sub

Si todo sale bien, deberíamos haber visualizado la versión del intérprete de Python y el resultado de la expresión “1+2”

Este es un ejemplo facil y practico para ver como se implementa un servidor COM desde Python. ¿Qué para que nos puede servir esto? Para muchas cosas interesantes, hacer uso de los diccionarios, tuplas y listas de datos que son fáciles de usar y muy poderosas, desde VBA/Excel, al igual que hacer uso de los módulos de python, los cuales superan por mucho a lo que nos brinda VBA/Excel.

NOTA: Solo hay que registrar una vez el objeto COM y después de ahí se puede llamar cuantas veces sea necesario, ya que si se registra varias veces se duplica en el registro de Windows.
Lo malo de esto es que si se desarrolla una aplicación que hay que entregar al cliente, este debe contar con el interprete Python y debe registrar el objeto COM antes de ser usado por primera vez, para este tipo de inconvenientes, podemos utilizar Py2Exe para generar una DLL o EXE y asi poder distribuir el objeto COM sin necesidad de tener instalado Python. Otra ventaja adicional es que nadie podra ver el codigo desarrollado en Python, ya que este no residira en los modulos de VBA/Excel.

Para más información al respecto, pueden revisar la fuente original: Servidor Interfase COM
 

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s