Можно ли вызвать скрипт, передав ему словарь? - PullRequest
0 голосов
/ 10 октября 2019

Я пытаюсь вызвать скрипт из другого. Мне нужно передать словарь в сценарий, который я вызываю, который будет содержать несколько матриц.

Решение, которое я нашел, состоит в том, чтобы пройти через сохранение консерванта, чтобы перезагрузить его в вызываемом сценарии.

Я задаюсь вопросом, является ли то, что я сделал, единственным решением или возможно передать напрямую словарь вызываемому скрипту?

Вот минимальный пример:

file1 (где скрипт вызывается):

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)

файл 2 (вызываемый скрипт):

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 ]

1 голос
/ 10 октября 2019

Это зависит от вашего использования, но здесь есть три варианта.

Опция 1

Вы добавляете словарную логику в тот же файл, что и тот, который нужен

Опция2

У вас все еще есть словарь в другом файле, поэтому вы делаете

#file 1

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

А затем в файле 2:

#file 2
from file1 import dictionary

use_dict(dictionary)

Опция 3

Вы генерируете словарь и используете его позже, или несколько раз, и вы не хотите генерировать его снова. Здесь вы можете сделать, как вы делаете сейчас. Но, как уже упоминалось в комментарии, предпочитайте формат json, так как он удобочитаемый и безопасный для человека.

#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) 

Edit 1

OP упоминает в комментарии, что ему нужно передать массив. Здесь также есть три возможности:

Опция 1

Хранить переменные, необходимые для создания ndarray в словаре.

Вариант 2 *

Преобразовать ndarray во вложенный список и сохранить его в json, затем получить вложенный список и преобразовать его в массив. Это будет мой предпочтительный вариант.

numpy tolist

Опция 3

Использовать pickle вместо json, как упоминалось в предыдущем варианте 3.

0 голосов
/ 10 октября 2019

Вы можете использовать аргументы commanline для передачи вашего словаря

import os

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

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

Это ваш основной скрипт

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

Вот как вы можете читать словарь

0 голосов
/ 10 октября 2019

Почему вы хотите сгенерировать словарь в file1, сохранить его на диск и затем загрузить словарь обратно в file2? Это значительно увеличивает время выполнения скрипта. Я бы предложил лучший способ:

  1. Создать словарь в файле1
  2. Изменить файл2 так, чтобы файл2 содержал только определения функций, которые необходимы для работы со словарем.
  3. Импорт определенных функций, присутствующих в файле2, внутри самого файла1
  4. После импорта используйте импортированную функцию из словаря в самом файле1.
...