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 (https://foro.elhacker.net/scripting/python_3_unir_dos_listas_en_una-t477732.0.html))
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
estaba por leer esa chorrada de código pero solo llegué hasta acá:
Resulta que el modulo pickle, solo toma objetos para serializar de listas,
¿de dónde sacaste eso?
archivo=open("a.txt","r")
contenido=archivo.readlines()
with open("e.cex", "wb") as f:
dump(contenido, f)
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)