无法存储或发送来自 node.js spawn 的 json 输出
Cannot store or send json output from node.js spawn
我正在尝试使用以下代码来获得所需的 python 输出并存储它,并将结果作为来自 Node.js 的 http 响应发送。这是我的代码
这是pythontest.py文件
import sys
print("Output from Python")
print("First name: " + sys.argv[1])
print("Last name: " + sys.argv[2])
这是Node.js生成方法
testRoute: async(req, res, next) => {
var output="";
var child = spawn('python', [`${process.cwd()}/pyCodes/test.py`,
'Itachi',
'Uchiha'
]);
child.stdout.setEncoding('utf8');
await child.stdout.on('data', (data) => {
data = data.toString();
output += data;
});
child.stderr.on("data", (data) => {
data = data.toString();
output += data;
});
child.on("error", (error) => {
error = error.toString();
output += error;
});
child.stderr.pipe(process.stderr);
cosnsole.log('output: ', output) // this shows output as empty
child.on("close", (code) => {
return res.send({
statusCode: 200,
status: 'Success',
data: output, // the output is like this : "Output from Python\r\nFirst name: Itachi\r\nLast name: Uchiha\r\n"
});
});
}
但输出仅在控制台/内部 spawn 方法中打印。如果我从外部 spawn 方法访问输出,它显示为空。如何将 python 代码的输出存储在某个变量中?此外,如果我直接在 child.on('close') 中执行 res.send() ,结果字符串包含特殊字符,如 '\r'、'\n' 等......我如何避免这种情况?我什至尝试使用 JSON.parse 但它抛出错误 finding unwanted token at position 0 。如果有人可以让我知道如何在 res.send() 中获得正确的输出,以及如何将输出存储在变量中,即使 JSON?
But the output only prints in console/ insides spawn methods. If I
access the output from outside spawn methods it shows empty. How can I
store the output from python code in some variable?
你不能。由于 spawn 方法是 运行 异步的。一旦收到关闭事件触发器,它就会打印或播放数据。因此,您的代码必须与行为保持一致。
child.on("close", (code) => {
console.log("output")
}
Also if I directly do res.send() inside child.on('close') the
resultant string contains special characters like '\r','\n' etc... how
can i avoid that
您可以使用正则表达式从最终字符串中删除 special/escape 个字符。 example
child.on("close", (code) => {
output = output.replace(/\"/g, '"'); //somewhat like regex ?
return res.send({
statusCode: 200,
status: 'Success',
data: output
});
});
}
我不认为有任何这样的方法可以做到这一点。您所能做的就是将您从 spawn 获得的 python 代码的结果传递给另一条路线,或者通过 http 响应 return 将其传递给另一个函数。
我正在尝试使用以下代码来获得所需的 python 输出并存储它,并将结果作为来自 Node.js 的 http 响应发送。这是我的代码
这是pythontest.py文件
import sys
print("Output from Python")
print("First name: " + sys.argv[1])
print("Last name: " + sys.argv[2])
这是Node.js生成方法
testRoute: async(req, res, next) => {
var output="";
var child = spawn('python', [`${process.cwd()}/pyCodes/test.py`,
'Itachi',
'Uchiha'
]);
child.stdout.setEncoding('utf8');
await child.stdout.on('data', (data) => {
data = data.toString();
output += data;
});
child.stderr.on("data", (data) => {
data = data.toString();
output += data;
});
child.on("error", (error) => {
error = error.toString();
output += error;
});
child.stderr.pipe(process.stderr);
cosnsole.log('output: ', output) // this shows output as empty
child.on("close", (code) => {
return res.send({
statusCode: 200,
status: 'Success',
data: output, // the output is like this : "Output from Python\r\nFirst name: Itachi\r\nLast name: Uchiha\r\n"
});
});
}
但输出仅在控制台/内部 spawn 方法中打印。如果我从外部 spawn 方法访问输出,它显示为空。如何将 python 代码的输出存储在某个变量中?此外,如果我直接在 child.on('close') 中执行 res.send() ,结果字符串包含特殊字符,如 '\r'、'\n' 等......我如何避免这种情况?我什至尝试使用 JSON.parse 但它抛出错误 finding unwanted token at position 0 。如果有人可以让我知道如何在 res.send() 中获得正确的输出,以及如何将输出存储在变量中,即使 JSON?
But the output only prints in console/ insides spawn methods. If I access the output from outside spawn methods it shows empty. How can I store the output from python code in some variable?
你不能。由于 spawn 方法是 运行 异步的。一旦收到关闭事件触发器,它就会打印或播放数据。因此,您的代码必须与行为保持一致。
child.on("close", (code) => {
console.log("output")
}
Also if I directly do res.send() inside child.on('close') the resultant string contains special characters like '\r','\n' etc... how can i avoid that
您可以使用正则表达式从最终字符串中删除 special/escape 个字符。 example
child.on("close", (code) => {
output = output.replace(/\"/g, '"'); //somewhat like regex ?
return res.send({
statusCode: 200,
status: 'Success',
data: output
});
});
}
我不认为有任何这样的方法可以做到这一点。您所能做的就是将您从 spawn 获得的 python 代码的结果传递给另一条路线,或者通过 http 响应 return 将其传递给另一个函数。