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