Объединение синхронного Python с NodeJS - PullRequest
0 голосов
/ 10 ноября 2018

У меня есть скрипт узла, который выглядит следующим образом:

// 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 вернет обещание.Обещание не должно содержать никаких данных.

Выглядит примерно так:

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

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

module.exports = pythonWriter;

Как я могу создать или создать подпроцесс, который выполняется синхронно перед остальной частью моего Javascriptкод?Или, если это невозможно, вернуть объект, похожий на обещание, который затем вызовет отдельный блок then?

Спасибо за помощь.

1 Ответ

0 голосов
/ 13 ноября 2018

Вы смотрели документацию child_process ?

Вы можете либо использовать spawnSync(), либо вы можете наблюдать за событиями в объекте childProcess, возвращаемом spawn, чтобы узнать, когда это будет сделано, либо вы можете использовать функцию обратного вызова с .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, чтобы увидеть, когда оно закончится.

...