我可以轻松地将列表列表从 Node 传递到 python 吗?

Can I pass a list of lists from Node to python easily?

我知道通过 CLI 将更复杂的数据结构(例如列表的列表)传递给 python 脚本存在一些问题。

我想知道 运行 来自节点代码的 python 脚本是否有任何这些相同的问题。

基本上,假设我在节点应用程序中有以下代码:

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

Question the above code is from

假设 arg1 和 arg2 是节点应用程序中列表的列表。并假设 arg3 是双精度数。

我的 script.py 文件中用于解析这些参数并将其接收到变量中的相应代码如下所示:

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

这里的 oc 和 nc 会是 python 中列表的列表吗?还是需要做其他事情才能使它正常工作?

传递复杂结构的最简单方法是先将其序列化为一些常见的数据格式,例如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])

但是,与其将序列化参数作为被调用方参数传递,不如使用 stdoutstdin 流来交换大于几百字节的数据:

const { spawn } = require("child_process");

const python = spawn('python', ["script.py"]);
const buffers = [];

python.stdout.on('data', (chunk) => buffers.push(chunk));
python.stdout.on('end', () => {
    const result = JSON.parse(Buffer.concat(buffers));
    console.log('Python process exited, result:', result);
});

python.stdin.write(JSON.stringify(["foo", "bar", "baz"]));
python.stdin.end()

并通过 json.loadsys.stdin 接受它,它采用流而不是字符串:

import sys, json

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