与节点子进程

时间:2017-08-06 04:34:36

标签: python node.js child-process

我试图将python脚本称为节点脚本中的子进程。脚本的输出将在回调中使用。代码如下所示:

//myFunction.js

const myFunction = callback => {
  let py = process.spawn('python', ['../folder/pyscript.py'], {
    cwd: '../folder/'
  });

  let str = '';

  py.stdout.on('data', data => {
    str += data.toString();
  }

  py.stdout.on('end', () => {
    callback(str);
  }
}

exports.myFunction = myFunction;

当我直接运行节点myFunction.js(在脚本中有myFunction的实例)时,此代码按预期工作,并且当我在与myFunction.js相同的目录中的任何其他文件中需要该模块时,它可以正常工作

但是当在不同的更高级别目录中需要该模块时,它会因以下错误而失败:

error: spawn python ENOENT

我猜这与路径有关(cwd的值可能是?)但我似乎无法解决这个问题。我查了类似的问题,但答案没有帮助。

任何帮助将不胜感激。 :)

3 个答案:

答案 0 :(得分:0)

显然,问题出在cwd。脚本中的所有内容都是相对于调用脚本的目录的路径。因此,基本上,从项目根目录运行node myFunction.js(例如~/projects/myProject会将cwd设置为~/projects/myProject/../folder,其评估结果为~/projects/folder。这显然是不正确的,因为很可能,系统上不存在名为folder的目录,因此将导致ENOENT错误。

解决方案是通过使用__dirname__属性和path模块提供的功能,在代码中构造脚本的绝对路径。

答案 1 :(得分:0)

我经历了数天的苦苦挣扎,然后才意识到由于某些filepath问题,nodeJS没有拾取并生成我的脚本文件。

尽管我不能保证这对每个人都适用,但取决于他们的设置,这是我在nodejs文件中所做的:

let py = process.spawn('python', [__dirname + '../folder/pyscript.py']);

如您所见,我不必使用{cwd: '../folder/'}选项。

如果您的脚本作为javascript文件位于当前目录中,则只需

let py = process.spawn('python', [__dirname + './pyscript.py']);  

我还应该指出:

process.spawn('python',['./pyscript.py']));

从不为我工作,我花了好几天想知道为什么。在我尝试此技术之前,无法找到答案。希望有人遇到这个问题。

答案 2 :(得分:0)

使用 ${process.cwd()} 对我有用...你可以这样写

let py = process.spawn('python', [`${process.cwd()}/folder/pyscript.py`]});