我知道通过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中的列表列表吗?还是需要做其他事情才能使它正常工作?
答案 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])
但是,与其传递序列化数据作为被调用方参数,不如使用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)