Cobol Foro
Navegación en el Foro
Retroceder   Cobol Foro Entornos de desarrollo y compiladores Cobol Fujitsu COBOL PowerCOBOL (ActiveX, v4 - v11)
PowerCOBOL (ActiveX, v4 - v11) Versiones del IDE basadas en ActiveX
 
Respuesta
 
Herramientas

  #11
Antiguo 11 de septiembre de 2025, 19:47
Kuk
Administrador
Última Actividad 19.09.2026 20:11
Posts Posts: 2.500
Likes enviados Enviados: 1037
Likes recibidos Recibidos: 1207

@fastpho, lo mismo me he perdido algo pero... para qué quieres generar un EXE con código Python?

Claro está que por poder se pueden hacer muchas cosas, pero es que si quieres un EXE, por qué aprender Python que es un lenguaje de scripting (interpretado), por defecto sin opciones para generar binarios (y menos nativos).



NORMAS DEL FORO - para garantizar el buen funcionamiento del Foro.
¿Te han ayudado? NO TE OLVIDES de darle a
¿Quieres dirigirte a alguien en tu post? Notifícale haciendo clic en su Nick
Kuk is offline   Responder Con Cita
  #12
Antiguo 11 de septiembre de 2025, 21:31
fastpho
El Foro es mi casa
Innovación: Por aportar innovaciones - Issue reason: SQLite + OO Cobol class Concurso: Primer puesto: Ganador/a del Primer puesto en un concurso - Issue reason: Acceso a datos Cobol vía web 
Última Actividad 21.08.2026 18:08
Posts Posts: 365
Likes enviados Enviados: 252
Likes recibidos Recibidos: 243

@kuk , El tema es la distribucion , por eso convierto .py a . exe , sin tener dependencias.
Me encanto python es muy facil , pocas lineas , etc .....

Saludos...
fastpho is offline   Responder Con Cita
  #13
Antiguo 11 de septiembre de 2025, 23:22
Fito
Guardián del Foro
Agradecimientos: Por muchos agradecimientos de parte de los Foreros - Issue reason: Por muchos agradecimientos de parte de los Foreros Guardián del Foro: Guardián del espíritu y clima del Foro - Issue reason: Por el Avatar Activista del Foro: Activista del Foro - Issue reason: Por aportar ideas 
Última Actividad 19.09.2026 13:19
Posts Posts: 458
Likes enviados Enviados: 267
Likes recibidos Recibidos: 243

Hola Amigos:

Coincido con Osvaldo en Python, es muy sencillo, y hay mucho código dando vueltas para hacer lo que quieras, de manera bastante sencilla. Al integrarlo por COM en PowerCobol, nos corre la línea de los límites mucho más allá.

Saludos.

Fito...
Fito is offline   Responder Con Cita
  #14
Antiguo 12 de septiembre de 2025, 18:50
Jorgeanna
Forero Junior
Última Actividad 25.01.2026 23:59
Posts Posts: 24
Likes enviados Enviados: 0
Likes recibidos Recibidos: 39

hola fastpho!!
Veo que estas utilizando python 64 bits por lo que dices, convertido a exe mediante Pyinstaller

1. Por si ayuda en algo a alguien que esta empezando a probar, para registrar un servidorCOM la forma correcta de hacerlo es en modo adminitrador.

2. Para que esta comunicación funcione, el cliente (PowerCOBOL) carga al servidor (Python COM) dentro de su propio espacio de trabajo. La regla fundamental es que un programa de 32 bits solo puede cargar componentes de 32 bits.

Si intentaras usar Python de 64 bits como dices, tu aplicación de PowerCOBOL de 32 bits simplemente no podría "ver" ni cargar el servidor COM de 64 bits. Te daría un error, típicamente diciendo que "la clase no está registrada" o que "no se puede crear el objeto", porque para él, ese componente de 64 bits es incompatible.

No entiendo como lo haces funcionar entonces, salvo que estes llamando a un exe, ejecute su rutina generando un archivo de texto con la respuesta y luego desde powerCOBOL leer ese archivo y mostrar la respuesta. Pero aun asi lo que no me cierra de este analisis, es que para generar la respuesta tiene que haber recibido la orden correcta????

Si esto fuera mas o menos asi, estarias desaprovechando el retorno de los datos de python y su aplicacion directa en en tu programa en powerCOBOL.
Pregungo porque es interesante y no se me dio por probar con python 64 bits, entendiendo que no seria logico recibir los datos usando esa tecnologia.
Cualquier avance que hayas realizado, todo sirve y ampliamos conocimientos.
Saludos cordiales.
Jorgeanna is offline   Responder Con Cita
  #15
Antiguo 15 de septiembre de 2025, 14:40
fastpho
El Foro es mi casa
Innovación: Por aportar innovaciones - Issue reason: SQLite + OO Cobol class Concurso: Primer puesto: Ganador/a del Primer puesto en un concurso - Issue reason: Acceso a datos Cobol vía web 
Última Actividad 21.08.2026 18:08
Posts Posts: 365
Likes enviados Enviados: 252
Likes recibidos Recibidos: 243

Hola @Jorgeanna , entiendo lo que planteas , la version que tengo instalada es 3.13.6(64-bit) adjunto imagen ,
el ejemplo que pase es tal cual , por que funciona me parece que la clave es el archivo elsloc_file.spec (*'pywin32_system32*)


* como administrador (cmd) corro esto --> : python elsisloc.py --register
* Convertir de .py .exe
#_reg_class_spec_ = "elsisloc.Controller" esta linea la tengo que comentar para que funcione python elsisloc.py --register
_reg_class_spec_ = "elsisloc.Controller" esta linea la tengo que descomentar para que funcione cuando uso pyinstaller

desde cmd : #para convertir a .exe : pyinstaller elsloc_file.spec

Código PYTHON:
  1. # -*- mode: python ; coding: utf-8 -*-
  2.  
  3. import os
  4. import sys
  5. import time
  6. import win32com
  7.  
  8. a = Analysis(
  9.     ['elsisloc.py'],
  10.     pathex=[],
  11.     binaries=[
  12.     (os.path.join(sys.prefix, 'Lib', 'site-packages', 'pywin32_system32', f'pythoncom{sys.version_info.major}{sys.version_info.minor}.dll'), '.'),
  13.     (os.path.join(sys.prefix, 'Lib', 'site-packages', 'pywin32_system32', f'pywintypes{sys.version_info.major}{sys.version_info.minor}.dll'), '.')
  14.     ],
  15.     datas=[('elsisloc.py', '.')],
  16.     hiddenimports=[
  17.         'pythoncom',
  18.         'win32com',
  19.         'win32com.server',
  20.         'win32com.server.register',
  21.         'win32com.server.localserver',
  22.         'pywintypes',
  23.         'win32timezone',
  24.         'ctypes',
  25.     ],
  26.     hookspath=[],
  27.     hooksconfig={},
  28.     runtime_hooks=[],
  29.     excludes=[],
  30.     noarchive=False,
  31. )
  32. pyz = PYZ(a.pure)
  33.  
  34. exe = EXE(
  35.     pyz,
  36.     a.scripts,
  37.     a.binaries,
  38.     a.datas,
  39.     [],
  40.     name='elsisloc',
  41.     debug=False,
  42.     bootloader_ignore_signals=False,
  43.     strip=False,
  44.     upx=True,
  45.     upx_exclude=[],
  46.     runtime_tmpdir=None,
  47.     console=False,
  48.     disable_windowed_traceback=False,
  49.     argv_emulation=False,
  50.     target_arch=None,
  51.     codesign_identity=None,
  52.     entitlements_file=None,
  53. )


y funciona perfectamente en windows 10 de 64 bits , no probado windows 11, meti pruebas en windows 7 de 64 y me saco peinado con muchos erroress
osea no funcione en windows 7 , mi version de Pwc es la 5 ,
si miras el ejemplo veras que es todo por object reference COM. (*COM) , no hay .txt , que esa era la idea incial que planteo
@Fito , si devuelve un .csv con lo solicitado


Saludos ...

Miniatura de Adjuntos
Pulsar la imagen para la versión amplia
Nombre:  jorpyver.png
Vistas: 127
Tamaño:  63,7 KB  

Última edición por fastpho fecha: 15 de septiembre de 2025 a las 14:44.
fastpho is offline   Responder Con Cita
  #16
Antiguo 16 de septiembre de 2025, 05:29
Jorgeanna
Forero Junior
Última Actividad 25.01.2026 23:59
Posts Posts: 24
Likes enviados Enviados: 0
Likes recibidos Recibidos: 39

hola @fastpho:

Felicitaciones, he probado el script que pasaste y quedo gratamente sorprendido, lo estoy corriendo desde un cliente 32 bits, como asi tambien desde un cliente 64 bits y tambien funciona, no entiendo como puede ser, se me quemaron los manuales, pero FUNCIONA y no deberiamos entonces preocuparnos por el entorno en que se desarrolle el servidorCOM.

Ademas lo he probado en windows 11 y anda perfectamente.

Creo que la magia esta en la configuracion del archivo spec, incorporando las librerias en el mismo, soluciona los problemas de empaquetado de pyinstaller, que no era suficiente con por ejemplo: pyinstaller --onefile --windowed --hidden-import=win32timezone elsisloc.py ya que cada error habia que incorporar las librerias que no detectaba el compilador, IMPECABLE LO TUYO y UN APORTE SIGNIFICATIVO.

Respecto del archivo de texto, hice una mala lectura, vi que guardaba la consulta en un archivo csv y asumi que luego lo leian y no era asi, lo genera, no se el objetivo pero la informacion es tomada del propio return.

Archivo generado al momento de la consulta.
1,"monumental, buenos aires, argentina",-34.5452932,-58.4497385,OK,2025-09-15 23:58:44
1,"bombonera, buenos aires, argentina",-34.6355171,-58.3649163,OK,2025-09-15 23:59:33

Veo que el tema ha tenido muchas lecturas, no veo reportes de si lo estan utilizando o solo leen los post, pero si quieren probar el servidorCOM generado y presentado gentilmente por @fastpho, le dejo un script en vbs para que puedan probar en forma rapida el mismo, y vean la magia de trabajar desde otro lenguaje y utilizar el mundo python:

abre navegador en la ubicacion especificada
64 bits
wscript.exe C:\PyPracticas\fastpro\ localizar_con_mapa.vbs
32 bits
C:\Windows\SysWOW64\wscript.exe C:\PyPracticas\fastpro\ localizar_con_mapa.vbs

Obs. cambiar la ubicacion del script.

Código VB:
  1. ' =================================================================
  2. ' servidorCOM autor: @fastpho:
  3. ' Script: localizar_con_mapa.vbs
  4. ' Propósito: Probar el objeto COM, geocodificar una dirección
  5. ' y abrir la ubicación resultante en un mapa.
  6. ' =================================================================
  7.  
  8. ' --- 1. Declaración de variables ---
  9. Dim objGeo, direccion, resultado, partesResultado
  10. Dim estado, latitud, longitud, mensaje
  11. Dim askToOpenMap, mapURL, shell
  12.  
  13. ' --- 2. Solicitar dirección al usuario ---
  14. direccion = InputBox("Introduce la direccion a geocodificar:", "Geolocalizacion")
  15.  
  16. If direccion = "" Then
  17.     MsgBox "No se ingreso ninguna direccion. El script finalizara.", vbExclamation, "Sin direccion"
  18.     WScript.Quit
  19. End If
  20.  
  21. ' --- 3. Creación del Objeto COM ---
  22. On Error Resume Next
  23. Set objGeo = CreateObject("LocPyCOM.elsCOMObject")
  24. On Error GoTo 0
  25.  
  26. ' --- 4. Verificación y uso del objeto ---
  27. If objGeo Is Nothing Then
  28.     MsgBox "ERROR: No se pudo crear el objeto COM 'LocPyCOM.elsCOMObject'." & vbCrLf & vbCrLf & _
  29.            "Por favor, asegurate de haber registrado el servidor COM.", vbCritical, "Error de Objeto"
  30. Else
  31.     ' Llamamos al método para obtener las coordenadas
  32.    resultado = objGeo.CrearLocalizacion(direccion)
  33.  
  34.     ' Procesamos la respuesta que viene separada por "|"
  35.    partesResultado = Split(resultado, "|")
  36.     estado = partesResultado(0)
  37.  
  38.     If UCase(estado) = "OK" Then
  39.         latitud = partesResultado(1)
  40.         longitud = partesResultado(2)
  41.        
  42.         ' Mostramos el mensaje con el resultado exitoso
  43.        mensaje = "Geocodificacion Exitosa" & vbCrLf & vbCrLf & _
  44.                   "Latitud: " & latitud & vbCrLf & _
  45.                   "Longitud: " & longitud
  46.         MsgBox mensaje, vbInformation, "Resultado"
  47.        
  48.         ' Preguntamos al usuario si desea abrir el mapa
  49.        askToOpenMap = MsgBox("¿Deseas abrir esta ubicacion en un mapa?", vbYesNo + vbQuestion, "Abrir Mapa")
  50.  
  51.         If askToOpenMap = vbYes Then
  52.             ' Construye una URL de Google Maps moderna y confiable
  53.            mapURL = "https://www.google.com/maps/search/?api=1&query=" & latitud & "," & longitud
  54.            
  55.             ' Abrimos la URL en el navegador por defecto
  56.            Set shell = CreateObject("WScript.Shell")
  57.             shell.Run mapURL
  58.             Set shell = Nothing
  59.         End If
  60.     Else
  61.         ' Mostramos el mensaje de error devuelto por el objeto COM
  62.        mensaje = "La geocodificación fallo." & vbCrLf & vbCrLf & _
  63.                   "Mensaje del servidor: " & partesResultado(1)
  64.         MsgBox mensaje, vbExclamation, "Resultado con Error"
  65.     End If
  66.  
  67.     ' Liberamos el objeto de la memoria
  68.    Set objGeo = Nothing
  69. End If

Saludos cordiales
Comentario de Moderador

Por favor, usar los resaltes de sintaxis para que quede "elegante" el post

Última edición por Josber fecha: 16 de septiembre de 2025 a las 08:55.
Jorgeanna is offline   Responder Con Cita
  #17
Antiguo 1 de octubre de 2025, 18:30
Paulo
Forero Senior
Última Actividad 17.09.2026 16:22
Posts Posts: 101
Likes enviados Enviados: 25
Likes recibidos Recibidos: 33

Olá a todos.
Este é um excelente tema, realmente permite ultrapassar algumas limitações do Cobol.

Obrigado a todos os que aqui deram estas informações.

Estive a testar e realmente funciona (estou a usar Python 3.13.7 (64bits).
Também já converti um script .py para. exe
A minha duvida é: como se usa o .exe gerado pelo py2exe no cobol ?
Já tentei chamar com argumentos, mas não consegui resulltados...

Podem ajudar ?
Gracias
Paulo is offline   Responder Con Cita
  #18
Antiguo 3 de octubre de 2025, 01:17
Jorgeanna
Forero Junior
Última Actividad 25.01.2026 23:59
Posts Posts: 24
Likes enviados Enviados: 0
Likes recibidos Recibidos: 39

Hola, especificamente no se tus dudas, pero por la version de python que estas trabajando deberias empaquetar la app con pyinstaller, con una serie de parametros para que incluya todas las librerias en un solo ejecutable.
Dicho esto te paso un resumen que armo la IA en funcion de parametros que le pase y creo queda bastante claro para entender el uso de esta herramienta:

Diferencias Clave entre Servidores COM: DLL (In-Process) vs. EXE (Out-of-Process)

1. ¿Qué es un Servidor COM?
Un servidor COM es un componente de software que permite que diferentes aplicaciones se comuniquen entre sí. Por ejemplo, una aplicación antigua desarrollada en Visual Basic 6, PowerCOBOL puede utilizar funcionalidades modernas de Python a través de un objeto COM. La forma en que este servidor se ejecuta determina su rendimiento y sus características.

2. Tipos de Servidores COM y sus Diferencias Fundamentales. Existen dos maneras principales de implementar un servidor COM:

a) Servidor COM In-Process (.dll)
¿Cómo funciona? El servidor se carga directamente en el mismo espacio de memoria de la aplicación que lo está utilizando (la aplicación cliente). No se crea un proceso nuevo.

Ventaja Principal: Velocidad. La comunicación es extremadamente rápida porque es una llamada directa a una función dentro del mismo proceso. No hay sobrecarga por la comunicación entre procesos distintos.

b) Servidor COM Out-of-Process (.exe)
¿Cómo funciona? El servidor se ejecuta en su propio proceso, separado de la aplicación cliente. Cada vez que la aplicación cliente necesita algo, el sistema operativo debe gestionar la comunicación entre ambos procesos.

Desventaja Principal: Velocidad. Es inherentemente más lento que un servidor in-process. Aunque la diferencia puede ser de milisegundos, en operaciones muy frecuentes o intensivas puede ser notable.

Ventaja Principal: Aislamiento y Estabilidad. Si el servidor COM falla o se bloquea, no afecta a la aplicación cliente, que puede seguir funcionando.

3. Aplicación en el Mundo Python
La elección entre un .dll y un .exe en Python está fuertemente ligada a la versión del lenguaje que se utilice.

Python 2.7: La Vía Rápida con DLLs

Utilizando la herramienta py2exe (en su versión clásica), es posible empaquetar un servidor COM como una DLL in-process.

Ideal para: Sistemas que requieren máxima velocidad e integración directa, como aplicaciones de escritorio en VB6, Delphi o PowerCOBOL que necesitan respuestas instantáneas.

Limitación: Estarás atado a Python 2.7 y no podrás utilizar las bibliotecas más modernas que solo son compatibles con Python 3 (como versiones recientes de Pandas, TensorFlow, etc.).

Python 3.x: Modernidad y Flexibilidad con EXEs

La versión moderna de py2exe para Python 3 no soporta la creación de DLLs COM. Sin embargo, se pueden crear servidores COM out-of-process (.exe) utilizando la librería pywin32.

Ideal para: Proyectos que necesitan acceder a las últimas bibliotecas de Python para ciencia de datos, inteligencia artificial, análisis de datos, etc. La pequeña pérdida de rendimiento es un compromiso aceptable a cambio de la potencia y el soporte de las nuevas tecnologías.

Conclusión: Si necesitas librerías modernas, esta es la única vía.

4. Flujo de Trabajo Recomendado para el Desarrollo
No es necesario empaquetar el servidor en un .dll o .exe desde el primer día. El proceso recomendado es:

Desarrollo y Pruebas (usando el .py): Durante la fase de programación, puedes registrar directamente tu archivo .py como un servidor COM en el sistema. Esto te permite probar la comunicación con la aplicación cliente de forma rápida y sencilla sin necesidad de compilar nada.

Empaquetado para Distribución (creando el .dll o .exe): Una vez que la lógica del servidor está validada y funciona correctamente, el siguiente paso es empaquetarlo. Esto permite distribuir e instalar el servidor en máquinas cliente sin necesidad de tener Python instalado en ellas.

Si decides probar un ejemplo simple con py2exe recurda bajar la version de python 2.7.18 en su version 32 bits, ya que powerCOBOL es de 32 bits y como trabaja en el mismo espacio de memoria debe ser ambos de 32 bits.

Si necesitas algo en concreto, contacta por privado o espera que algunos foreros dijeron que publicarian novedades cuando las tengan.

Mucha Suerte, no dejes de intentarlo.
Jorgeanna is offline   Responder Con Cita
Respuesta



Derechos de Publicación
No puedes publicar nuevos temas
No puedes publicar posts/responder
No puedes adjuntar archivos
No puedes editar tus posts

BB code is habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado

Saltar a Foro


La franja horaria es GMT +2. Ahora son las 14:58.
Powered by: vBulletin, Versión 3.8.7
Derechos de Autor ©2000 - 2026, Jelsoft Enterprises Ltd.