Estoy tratando de llamar un guión de otro. Necesito pasar un diccionario al script que llamo que contendrá algunas matrices.

La solución que encontré es pasar por un pickle save para volver a cargarlo en el script llamado.

Me pregunto si lo que hice es la única solución o si es posible pasar directamente el diccionario al script llamado.

Aquí el ejemplo mínimo:

File1 (donde se llama el script):

import subprocess
import sys
import os
import pickle

if __name__ == '__main__':
    dictionary = {'a':1,'b':2}
    filename_temp = os.path.abspath('filename.pickle')
    with open(filename_temp, 'wb') as handle:
        pickle.dump(dictionary, handle, protocol=pickle.HIGHEST_PROTOCOL)

    subprocess.Popen([sys.executable, os.path.join("", "Subproc.py "), filename_temp], shell=True)

Archivo 2 (el script que se llama):

import sys
import pickle

class useDict():
    def __init__(self,filename_temp=None):
        if filename_temp:
            with open(filename_temp, 'rb') as handle:
                Dictionary = pickle.load(handle)
                self.Dictionary = Dictionary
        else:
            self.Dictionary = None
        print(self.Dictionary)

def main(filename_temp=None):
    print(filename_temp)
    useDict(filename_temp)

if __name__ == '__main__':
    if len(sys.argv)>1:
        main(sys.argv[1])
0
ymmx 10 oct. 2019 a las 14:17

3 respuestas

La mejor respuesta

Depende de su uso, pero aquí hay tres opciones.

Opción 1

Agrega la lógica del diccionario en el mismo archivo que el que lo necesita

Opcion 2

Todavía tienes tu diccionario en otro archivo, así que sí

#file 1

 dictionary = {'a':1,'b':2}

Y luego en el archivo 2:

#file 2
from file1 import dictionary

use_dict(dictionary)

Opción 3

Genera el diccionario y lo usa más tarde, o varias veces, y no desea generarlo nuevamente. Aquí puedes hacer lo que haces ahora. Pero como se menciona en el comentario, prefiera el formato json ya que es legible y más seguro para los humanos.

#file 1
import json

dictionary = {'a':1,'b':2} 
filename_temp = os.path.abspath('filename.pjson') 
with open(filename_temp, 'w') as handle:
json.dump(dictionary, handle) 

#file 2
import json

 with open(filename_temp, 'r') as handle:
     self.Dictionary = json.load(handle) 

Editar 1

OP menciona en el comentario que necesita pasar una matriz. Aquí también, hay tres posibilidades.

Opción 1

Almacene las variables necesarias para producir el ndarray en el diccionario.

Opcion 2*

Convierta el ndarray en una lista anidada y almacénelo en json, luego recupere la lista anidada y conviértala en una matriz. Esta será mi opción preferida.

tolist numpy

Opción 3

Use pickle en lugar de json como se menciona en la opción 3 anterior.

1
Florian Bernard 10 oct. 2019 a las 12:22

Puede usar argumentos de línea de comando para pasar su diccionario

import os

mydictionary = {'1':'One', '2':'Two', '3':'Three'}

os.system(f"python myscript.py \"{mydictionary}\"")

Este es tu guión principal

import ast, sys
data = sys.argv[1]
mydict = ast.literal_eval(data)
print(mydict)
print(mydict["1"])
print(mydict["2"])
print(mydict["3"])

Así es como puedes leer el diccionario

-1
ikibir 10 oct. 2019 a las 11:54

¿Por qué desea generar el diccionario en el archivo1, guardarlo en el disco y luego cargar el diccionario nuevamente en el archivo2? Eso aumenta mucho el tiempo de ejecución del script. Sugeriría una mejor manera es:

  1. Generar el diccionario en el archivo 1
  2. Modifique file2 para que file2 contenga solo las definiciones de función que se necesitan para operar en el diccionario.
  3. Importe las funciones definidas presentes en el archivo2 dentro del propio archivo1
  4. Después de la importación, use la función importada en el diccionario en el archivo1 mismo.
0
Karthick Mohanraj 10 oct. 2019 a las 11:47
58321648