结合带有NodeJS的同步Python

时间:2018-11-09 23:42:48

标签: python node.js asynchronous process promise

我有一个如下所示的节点脚本:

// Preset Modules...
const fs = require("fs-extra");
const path = require("path");
const { join } = path;
const axios = require("axios");

// Global/Multi modules...
const { today } = require("./keys/globals");
const { logger } = require("./logger");

// Sequence modules...
const downloader = require("./downloader");
const settingScraper = require("./settings");
const treeMaker = require("./treeMaker");
/****/ const pythonWriter = require("./pythonWriter"); /****/
const fbDaemon = require("./firebase");
const zipper = require("./zipper");
const mailer = require("./mailer");
const { success, failure } = require("./results");

logger.write(`\nStarting download for: ${today}, at ${Date.now()}`);

axios.get(`http://federalregister.gov/api/v1/public-inspection-documents.json?conditions%5Bavailable_on%5D=${today}`)
  .then(downloader)
  .then(settingScraper)
  .then(treeMaker)
/****/  .then(pythonWriter) /****/
  .then(fbDaemon) // Should pass down array structure, like in config file.
  .then(zipper)
  .then(mailer)
  .then(success)
  .catch(failure);

该函数在线从API下载大量文件,而pythonWriter是一个单独的模块。在该模块中,我想触发一个python脚本,该脚本将在pythonWriter返回Promise之前“暂停”或同步执行。许诺将不必包含任何数据。

看起来像这样:

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

const pythonWriter = () => {
  const process = spawn("python", ["./script.py"]);
}

module.exports = pythonWriter;

如何在我的其余Javascript代码之前生成或创建一个同步执行的子流程?或者,如果不可能的话,返回类似promise的对象,然后将触发一个单独的then-block?

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

您看过child_process documentation吗?

您可以使用spawnSync(),也可以监视spawn返回的childProcess对象上的事件以了解其完成时间,或者可以将回调函数与.exec().execFile()一起使用,或者.spawn()查看完成的时间。

child_process文档似乎已经涵盖了您的要求。

以下是使用.spawn()的示例,摘自文档:

const { spawn } = require('child_process');
const ls = spawn('ls', ['-lh', '/usr']);

ls.stdout.on('data', (data) => {
  console.log(`stdout: ${data}`);
});

ls.stderr.on('data', (data) => {
  console.log(`stderr: ${data}`);
});

ls.on('close', (code) => {
  console.log(`child process exited with code ${code}`);
});

您可以收听close事件以了解其完成时间。