Empotrar módulos.

Pepe Aracil pepe en diselpro.com
Jue Ene 25 17:52:02 CET 2007


Gracias Chema por tus sugerencias.
Tu versión OOP ¡mola mazo! ;-P

Ahora me voy a pelear con las extensiones en C (.pyd) ya que
la función imp.load_module(...) no acepta un StringIO por
fichero. Debe ser por lo que tu comentabas ya que la carga
de estos módulos la debe gestionar el S.O. y necesitará un
handle de fichero real para cargarlo.

Salud.




Chema Cortes escribió:
> El 25/01/07, Pepe Aracil<pepe en diselpro.com> escribió:
>> Aquí tenéis (por si le interesa a alguien) una beta del programa
>> que empotra módulos dentro del script principal.
> 
> Ya he visto que has hecho un refundido con lo que te he pasado.
> Respondiendo al mensaje anterior donde pedías objeciones sobre las
> interioridades del python, te recomiendo que el diccionario del módulo
> lo pases como variables locales, o sea, en lugar de
> 
>  exec modulo_prueba in mo.__dict__
> 
> usar
> 
>  exec modulo_prueba in {}, mo.__dict__
> 
> of.write("""exec zlib.decompress(str_module.decode("base64")) in
> {},tmp_module.__dict__\n""")
> 
> 
> La razón es que el exec poluciona el espacio de nombres globales
> añadiendo una clave "__builtins__". Haciéndolo como te digo, evitas
> que se añadan más cosas al módulo  de las que deberían ser
> 
> Otra sugerencia es que podrías dar una mejor orientación a objetos
> utilizando el 'new.module' (según gustos de cada cuál). Aquí te dejo
> lo que sería mi versión:
> #! /usr/bin/python
> 
> import sys,os
> import zlib
> 
> PREAMBLE="""#! /usr/bin/python
> 
> import sys
> import new
> 
> class InlineModule(new.module):
>  def __init__(self, name, strdef):
>    from zlib import decompress
> 
>    super(InlineModule,self).__init__(name)
>    exec decompress(strdef.decode("base64")) in {}, self.__dict__
> """
> 
> MODULE_TEMPLATE="""
> ### Start of embedded module '%(modname)s' ###
> 
> if not "%(modname)s" in sys.modules:
>  sys.modules["%(modname)s"]=InlineModule("%(modname)s",
> '''%(modcode)s''')
> ### End of embedded module '%(modname)s' ###
> """
> 
> # Argumentos del script
> output = sys.argv[1]
> main = sys.argv[2]
> modules = sys.argv[3:]
> 
> # Generando el fichero unificado
> of = file(output,"w")
> 
> of.write(PREAMBLE)
> 
> for mo in modules:
>  of.write(MODULE_TEMPLATE%{
>    "modname": os.path.splitext(os.path.basename(mo))[0] ,
>    "modcode": zlib.compress(file(mo,"r").read()).encode("base64")
>  })
> 
> of.write("""\n### Start of main script ###\n""")
> of.write(file(main,"r").read())
> of.close()
> _______________________________________________
> Python-es mailing list
> Python-es en aditel.org
> http://listas.aditel.org/listinfo/python-es




Más información sobre la lista de distribución Python-es