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])
3 respuestas
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.
Opción 3
Use pickle en lugar de json como se menciona en la opción 3 anterior.
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
¿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:
- Generar el diccionario en el archivo 1
- Modifique file2 para que file2 contenga solo las definiciones de función que se necesitan para operar en el diccionario.
- Importe las funciones definidas presentes en el archivo2 dentro del propio archivo1
- Después de la importación, use la función importada en el diccionario en el archivo1 mismo.