Test Foro de elhacker.net SMF 2.1

Programación => Scripting => Mensaje iniciado por: n1sen en 7 Diciembre 2017, 01:16 AM

Título: Problemas...
Publicado por: n1sen 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 (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.
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
Título: Re: Problemas...
Publicado por: tincopasan 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 (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)