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"
;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.
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:
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))
el "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)
y del "assembler" donde estan las instrucciones para este "compilador":
;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