Problemas...

Iniciado por n1sen, 7 Diciembre 2017, 01:16 AM

0 Miembros y 1 Visitante están viendo este tema.

n1sen

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.
Código (python) [Seleccionar]

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 (python) [Seleccionar]

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":
Código (python) [Seleccionar]

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
null

tincopasan

#1
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 (python) [Seleccionar]

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)