Могу ли я легко передать список списков из Node в python? - PullRequest
0 голосов
/ 28 января 2019

Я знаю, что есть некоторые проблемы с передачей более сложных структур данных, таких как список списков, скрипту Python через CLI.

Мне было интересно, если запуск скрипта Python из кода узла имел какие-либо из этих проблем.

По сути, скажем, у меня есть следующий код в приложении узла:

const spawn = require("child_process").spawn;
const pythonProcess = spawn('python',["path/to/script.py", arg1, arg2, arg3]);

Вопрос, приведенный выше код от

Предположим, что arg1 иarg2 - это списки списков в приложении узла.И предположим, что arg3 является double.

Соответствующий код в моем файле script.py, предназначенный для анализа и получения этих аргументов в переменные, выглядит следующим образом:

import sys
if __name__ == '__main__':
    oc = sys.argv[1]
    nc = sys.argv[2]
    r = sys.argv[3]

Будут ли здесь oc и nc списками списков в python?Или нужно что-то еще сделать, чтобы это заработало?

1 Ответ

0 голосов
/ 28 января 2019

Самый простой способ передать сложные структуры - это сначала сериализовать его в некотором распространенном формате данных, таком как JSON:

const myList = ["foo", "bar", "baz"];
const { spawn } = require("child_process");
const python = spawn('python',["script.py", JSON.stringify(myList)]);

И десериализовать на стороне вызываемого:

import sys, json
if __name__ == '__main__':
    my_list = json.loads(sys.argv[1])

Новместо передачи сериализованных данных в качестве аргументов вызываемого абонента лучше использовать потоки stdout и stdin для обмена данными размером более нескольких сотых байтов:

const { spawn } = require("child_process");
const python = spawn('python',["script.py"]);
python.stdin.write(JSON.stringify(["foo", "bar", "baz"]))

и принимать их от sys.stdin через json.load, который принимает потоки вместо строк:

import sys, json
if __name__ == '__main__':
    my_list = json.load(sys.stdin)
...