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")
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
from _pickle import dump, dumps, load, loads obj = ['STR_PRINT "Hola mundo"', 'DIV("El numero 5 en 5 cabe:", 5, 5)', 'INT("test", "54")'] with open("e.cex", "wb") as f: dump(obj, f)
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
el "compilador":
from _pickle import dump, dumps, load, loads from system_instr import * import sys import os global os_name os_name = os.name def UnpickleExecutable(filepath): try: try: file = filepath.split("'") path = file[1] except IndexError: file = filepath.split('"') path = file[1] with open(path, "rb") as f: #Los archivos executables .cex son creados y leidos con _pickle en binario unpickled_obj = load(f) ReadExecutebleIns(unpickled_obj, path) except FileNotFoundError: print("File not founded.") except IndexError: print("Usage: exe 'executable.cex'") def ReadExecutebleIns(unpickled_obj, filename): #Esta funcion lee las instrucciones extraidas del ejecutable for EXEOBJ in unpickled_obj: print(EXEOBJ) if "STR_PRINT" in EXEOBJ: #Mustra en un texto en pantalla PRINTSTR = EXEOBJ.split('"') Text = PRINTSTR[1] print(Text, flush=True) elif "CMD_PAUSE" in EXEOBJ: #Pausa la consola shudder_data = input("Press any key to continue... ") shudder_data = None elif "EXIT" in EXEOBJ: #Sale del programa pass elif "CLEARSCR" in EXEOBJ: #Limpia la pantalla if os_name == 'posix': os.system("clear") elif os_name == 'nt': os.system("cls") else: pass elif "ADD" in EXEOBJ: exec(EXEOBJ) elif "SUB" in EXEOBJ: exec(EXEOBJ) elif "MUL" in EXEOBJ: exec(EXEOBJ) elif "DIV" in EXEOBJ: exec(EXEOBJ) elif "DIV_INT" in EXEOBJ: exec(EXEOBJ) elif "PUSH" in EXEOBJ: exec(EXEOBJ) elif ";" in EXEOBJ: pass else: #En caso que haya una intruccion invalida... print('!Illegal instruction "%s" in %s' % (EXEOBJ, filename))
Código
y del "assembler" donde estan las instrucciones para este "compilador":
import os, sys from _pickle import dump, dumps, load, loads from system_instr import * def ASM_File(filepath): try: try: file = filepath.split("'") path = file[1] except IndexError: file = filepath.split('"') path = file[1] PRG(path) except IndexError: print("Usage: tkasm 'program.asm'") def PRG(path): asm_file_cont = [] out_file = input("Output file name..: ") with open(path, 'r') as inputfile: with open(out_file, 'wb') as outputfile: for f1 in inputfile: f1 = [f1[:-1]] asm_file_cont.append(" ".join(f1))#por tu ejemplo lo convierto a cadena dump(asm_file_cont, outputfile) #supogo que es para escribir el contenido en el otro archivo print(asm_file_cont)
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