如何让Node.js等待Python子进程执行完毕后再继续执行?
解决JavaScript中等待Python子进程执行完毕的问题
你遇到的核心问题是:Node.js的child_process.spawn是异步操作,当前代码没有等待子进程执行完成就继续执行了后续逻辑,导致输出顺序不符合预期。要实现等待子进程结束后再执行后续代码,只需要把Spawn的执行逻辑封装成Promise,再用await等待这个Promise完成即可。
修改后的JavaScript代码
async function runPythonScript() { return new Promise((resolve, reject) => { const spawn = require('child_process').spawn; const py = spawn('python', ['main.py']); let dataString = ''; // 捕获Python脚本的标准输出 py.stdout.on('data', (data) => { dataString += data.toString(); }); // 子进程输出结束时,返回捕获到的内容 py.stdout.on('end', () => { resolve(dataString); }); // 捕获子进程的错误信息 py.stderr.on('data', (err) => { reject(new Error(err.toString())); }); py.stdin.write(JSON.stringify([])); py.stdin.end(); }); } async function main() { console.log("J: Hey...") console.log("J: I can't count to 5...") console.log("J: Can you help me, Mr. Python?") try { // 等待Python脚本执行完成并获取输出 const pythonOutput = await runPythonScript(); console.log(pythonOutput); } catch (error) { console.error('执行Python脚本时出错:', error); } console.log("J: Thank you, mister!") } main()
Python代码(无需修改)
def main(): print("P: Of course!") print("P: It's like this:") for i in range(5): print(f"P: {i + 1}") print("P: Hope that it helps!") if __name__ == "__main__": main()
关键说明
- Promise封装:将子进程的创建、输出捕获、结束监听逻辑放在Promise内部,当子进程输出结束(
end事件触发)时调用resolve返回结果;如果子进程出错(stderr有输出)则调用reject抛出错误。 - await等待:在
main函数中用await调用runPythonScript(),这会暂停main函数的执行,直到Promise完成(子进程执行结束),之后才会执行后续的console.log("J: Thank you, mister!")。 - 错误处理:用
try-catch包裹await调用,捕获Python脚本执行过程中可能出现的错误,避免程序崩溃。
这样修改后,执行顺序就会和你期望的一致:先打印JavaScript的请求内容,再打印Python的输出,最后打印JavaScript的感谢语句。
内容的提问来源于stack exchange,提问作者Chumito
相关产品推荐
相关产品推荐

