我可以轻松地将列表列表从 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])
但是,与其将序列化参数作为被调用方参数传递,不如使用 stdout
和 stdin
流来交换大于几百字节的数据:
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.load
从 sys.stdin
接受它,它采用流而不是字符串:
import sys, json
if __name__ == '__main__':
my_list = json.load(sys.stdin)
json.dump(my_list, sys.stdout)
我知道通过 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])
但是,与其将序列化参数作为被调用方参数传递,不如使用 stdout
和 stdin
流来交换大于几百字节的数据:
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.load
从 sys.stdin
接受它,它采用流而不是字符串:
import sys, json
if __name__ == '__main__':
my_list = json.load(sys.stdin)
json.dump(my_list, sys.stdout)