elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Scripting
| | |-+  Problemas...
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Problemas...  (Leído 2,128 veces)
n1sen

Desconectado Desconectado

Mensajes: 122



Ver Perfil
Problemas...
« en: 7 Diciembre 2017, 01:16 am »

Pues, eso vengo a molestar otra vez, con otro problema:
Resulta que he estado programando una "especie de formato ejecutable"
y este ejecutable se guarda serializado en un archivo.
La cosa es que ya vine a preguntar como resolver un problema que tenia con otro codigo. ([Python3]Unir dos listas en una)
Resulta que ese era un "compilador" para compilar codigo de una especie de "assembler" que cree para que se convierta en este ejecutable.
Tengo un archivo llamado "exe_read.py" que lee este fichero ejecutable que cree.

Y el problema?

Resulta que el modulo pickle, solo toma objetos para serializar de listas, y no de archivos, asi que tuve que hacer este "compilador"
Código:
;TarketakVOS Assembler
STR_PRINT "Hola mundo!"
DIV("El numero 5 en 5 cabe:", 5, 5)
INT("test", "54")
Ese es el assembler que cree

Cuando "compilo" este archivo con el "compilador", compila, pero al ejecutarlo con el archivo "exe_read.py" no ejecuta.
Sin embargo, si envez de usar este compilador que lee las instrucciones de un archivo envez de una lista, cree este script.
Código
  1. from _pickle import dump, dumps, load, loads
  2.  
  3. obj = ['STR_PRINT "Hola mundo"', 'DIV("El numero 5 en 5 cabe:", 5, 5)', 'INT("test", "54")']
  4.  
  5. with open("e.cex", "wb") as f:
  6.    dump(obj, f)
  7.  
  8.  

Lo "compila", y... sorpresa! cuando lo ejecuto con el archivo "exe_read.py" funciona.
Espero que me hayan entendido.
Les dejo el codigo de los scripts mencionados:

exe_read.py:
Código
  1. from _pickle import dump, dumps, load, loads
  2. from system_instr import *
  3. import sys
  4. import os
  5.  
  6. global os_name
  7. os_name = os.name
  8.  
  9.  
  10. def UnpickleExecutable(filepath):
  11.    try:
  12.        try:
  13.            file = filepath.split("'")
  14.            path = file[1]
  15.        except IndexError:
  16.            file = filepath.split('"')
  17.            path = file[1]
  18.  
  19.        with open(path, "rb") as f:
  20.            #Los archivos executables .cex son creados y leidos con _pickle en binario
  21.            unpickled_obj = load(f)
  22.            ReadExecutebleIns(unpickled_obj, path)
  23.  
  24.    except FileNotFoundError:
  25.        print("File not founded.")
  26.    except IndexError:
  27.        print("Usage: exe 'executable.cex'")
  28.  
  29. def ReadExecutebleIns(unpickled_obj, filename):
  30.    #Esta funcion lee las instrucciones extraidas del ejecutable
  31.    for EXEOBJ in unpickled_obj:
  32.        print(EXEOBJ)
  33.        if "STR_PRINT" in EXEOBJ: #Mustra en un texto en pantalla
  34.            PRINTSTR = EXEOBJ.split('"')
  35.            Text = PRINTSTR[1]
  36.            print(Text, flush=True)
  37.  
  38.        elif "CMD_PAUSE" in EXEOBJ: #Pausa la consola
  39.            shudder_data = input("Press any key to continue... ")
  40.            shudder_data = None
  41.  
  42.        elif "EXIT" in EXEOBJ: #Sale del programa
  43.            pass
  44.  
  45.        elif "CLEARSCR" in EXEOBJ: #Limpia la pantalla
  46.            if os_name == 'posix':
  47.                os.system("clear")
  48.            elif os_name == 'nt':
  49.                os.system("cls")
  50.            else:
  51.                pass
  52.        elif "ADD" in EXEOBJ:
  53.            exec(EXEOBJ)
  54.  
  55.        elif "SUB" in EXEOBJ:
  56.            exec(EXEOBJ)
  57.  
  58.        elif "MUL" in EXEOBJ:
  59.            exec(EXEOBJ)
  60.  
  61.        elif "DIV" in EXEOBJ:
  62.            exec(EXEOBJ)
  63.  
  64.        elif "DIV_INT" in EXEOBJ:
  65.            exec(EXEOBJ)
  66.  
  67.        elif "PUSH" in EXEOBJ:
  68.            exec(EXEOBJ)
  69.  
  70.        elif ";" in EXEOBJ:
  71.            pass
  72.  
  73.        else: #En caso que haya una intruccion invalida...
  74.            print('!Illegal instruction "%s" in %s' % (EXEOBJ, filename))
  75.  
  76.  
el "compilador":
Código
  1. import os, sys
  2. from _pickle import dump, dumps, load, loads
  3. from system_instr import *
  4.  
  5. def ASM_File(filepath):
  6.    try:
  7.        try:
  8.            file = filepath.split("'")
  9.            path = file[1]
  10.        except IndexError:
  11.            file = filepath.split('"')
  12.            path = file[1]
  13.  
  14.            PRG(path)
  15.  
  16.    except IndexError:
  17.        print("Usage: tkasm 'program.asm'")
  18.  
  19. def PRG(path):
  20.    asm_file_cont = []
  21.    out_file = input("Output file name..: ")
  22.    with open(path, 'r') as inputfile:
  23.        with open(out_file, 'wb') as outputfile:
  24.            for f1 in inputfile:
  25.                f1 = [f1[:-1]]
  26.                asm_file_cont.append(" ".join(f1))#por tu ejemplo lo convierto a cadena
  27.                dump(asm_file_cont, outputfile)  
  28.                                                                 #supogo que es para escribir el contenido en el otro archivo
  29.    print(asm_file_cont)
  30.  
  31.  
y del "assembler" donde estan las instrucciones para este "compilador":
Código:
;TarketakVOS Assembler
STR_PRINT "Hola mundo!"
DIV("El numero 5 en 5 cabe:", 5, 5)
INT("test", "54")

Me ubiese ahorrado todo esto si el modulo pickle hiciera algo tan simple como poder leer de un archivo los objetos a hacer "dump" aparte de solo una lista...
Saludos


« Última modificación: 7 Diciembre 2017, 01:19 am por n1sen » En línea

null
tincopasan


Desconectado Desconectado

Mensajes: 1.286

No es lo mismo conocer el camino que recorrerlo.


Ver Perfil
Re: Problemas...
« Respuesta #1 en: 7 Diciembre 2017, 04:33 am »

estaba por leer esa chorrada de código pero solo llegué hasta acá:
Citar
Resulta que el modulo pickle, solo toma objetos para serializar de listas,
¿de dónde sacaste eso?
Código
  1. archivo=open("a.txt","r")
  2. contenido=archivo.readlines()
  3.  
  4. with open("e.cex", "wb") as f:
  5.    dump(contenido, f)
  6.  

usando tu ejemplo, ahí uso un archivo sin convertir a listas.
otra cosa _pickle no es bueno usarlo en python 3 es mejor simplemente pickle(ya usa _pickle)



« Última modificación: 7 Diciembre 2017, 05:03 am por tincopasan » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines