gpt4 book ai didi

python - 通过spawn将JSON从python返回到 Node

转载 作者:太空宇宙 更新时间:2023-11-03 15:57:05 25 4
gpt4 key购买 nike

我有一个带有两个参数的 python 脚本;目录和文件名。

Python 脚本将从提供的目录中的特定文件创建一个 JSON 对象,并将其保存为第二个参数的名称。

但是,如果第二个参数等于字符串“stream”,则 JSON 数据将输出到 STDOUT。

我编写了一个 Node 脚本,它生成一个子进程以从终端调用 python 脚本,并且它按预期工作。

"use strict";

const spawn = require("child_process").spawn;

const command = "(path to python)";
const loc = "(path to .py script)";

const acct = process.argv[2];
const output = process.argv[3];

let callPy = spawn(command, ["erik.py", acct, output], {
cwd: loc,
stdio: "pipe"
});

callPy.stdout.on("data", (data) => {
if (data.toString() === "success") {
console.log(acct, "generated");
} else {
console.log(data.toString());
}
});

编辑:

我已将这个问题标记为已解决:在花费了更多时间尝试实现此问题后,我还没有找到一个令人满意的解决方案,该解决方案允许我从 Node 同步调用子进程,向 python 脚本发出信号以发出 JSON 数据,接收数据,然后将数据发送到浏览器。我尝试在子进程上使用 promise 链:

let child = require("child_process").spawn; // or spawnSync

let spawn = () => {
let spawned = child(command, args, options,(err, stdout, stderr) => {
if (err) { console.log(err) };
});
return spawned
};

let listen = (child) => {
child.stdout.on("data", (data) => {
console.log("PID", child.pid);
console.log("data from listen func: ", data);
return child
});
};

let kill = (child) => {
child.kill( "SIGTERM" );
}

var p = new Promise((res, e) => {
res( spawn() )
e( console.error(e) )
});

p.then(result => {
return listen(result);
})
p.then(result => {
return kill(result);
});

使用spawn()子进程在返回任何数据之前终止使用 spawnSync() promise 链在子进程生成之前尝试(但失败)监听子进程的 io

我还没有尝试使用 websockets 来传输数据,但我怀疑这能解决这个问题,在 Promise 链从 python 脚本中检索 block 之前,Promise 会向我的路由器函数调用返回一个空对象。

欢迎任何进一步的见解。

最佳答案

所以你至少需要两件事来做到这一点

  • 一种将命令排队以使用 spawn 执行的方法
  • 一种异步模式,用于等待命令的执行并在每个可执行文件终止时加入进程

一个简约的例子是

var cmd = new CommandLine({ 
debug : true,
error : true,
delay : true });
// commandItemsArray is a list of commands list, command options, command arguments
commandItemsArray = [ ['ls','-l','./'], ['ls','-a','./'] ];
cmd.executeCommands( commandItemsArray
, function(results) {
console.log( results );
}
, function(error) {
console.log( error );
});

npm 上有几个包可以同时执行这两种操作(搜索 Node cli、命令行等),其中之一是 node-commander使用 Promise.all 模式来实现第二个任务:

      function PromiseAll(items, block, done, fail) {
var self=this;
var promises = [], index=0;
items.forEach(function(item) {
promises.push( function(item,i) {
return new Promise(function(resolve, reject) {
return block.apply(this,[item,index,resolve,reject]);
});
}(item,++index))
});
Promise.all(promises).then(function AcceptHandler(results) {
if(done) done( results );
}, function ErrorHandler(error) {
if(fail) fail( error );
});
} //promiseAll

关于python - 通过spawn将JSON从python返回到 Node ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40687986/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com