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

时间:2019-01-28 04:17:49

标签: python node.js command-line-interface sys

我知道通过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中的列表列表吗?还是需要做其他事情才能使它正常工作?

1 个答案:

答案 0 :(得分:3)

传递复杂结构的最简单方法是首先以某种通用数据格式(例如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"]);
python.stdin.write(JSON.stringify(["foo", "bar", "baz"]))

并通过sys.stdinjson.load接受它,它接受流而不是字符串:

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