NodeJS 节点子进程产生python ENOENT错误

8oomwypt  于 2023-03-08  发布在  Node.js
关注(0)|答案(4)|浏览(231)

我尝试在节点脚本中调用一个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的值?),但我似乎不能解决这个问题。我已经查找了类似的问题,但答案没有帮助。
任何帮助都将不胜感激。:)

fquxozlt

fquxozlt1#

显然,问题出在cwd上。脚本中的所有内容都与调用脚本的目录 * 的路径有关。因此,基本上,从项目根目录运行node myFunction.js(比如~/projects/myProject)会将cwd设置为~/projects/myProject/../folder,而~/projects/myProject/../folder的计算结果为~/projects/folder。这显然是不正确的,因为很可能,no目录命名folder exists on这系统,并且因此这将导致一个ENOENT错误.
解决方案是在代码中构造脚本的绝对路径,也许可以结合使用__dirname__属性和path模块提供的功能。

deyfvvtc

deyfvvtc2#

我为这个问题挣扎了好几天,才意识到我的脚本文件没有被nodeJS拾取和生成,因为一些filepath问题。
虽然我不能保证这对每个人都有效,但这取决于他们的设置,这是我在nodejs文件中所做的:

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

如您所见,我不必使用{cwd: '../folder/'}选项。
如果您的脚本作为javascript文件位于当前目录中,只需执行以下操作

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

我还要指出:
进程.spawn('python',['./pyscript.py']);
从来没有为我工作,我花了几天时间想知道为什么。可以找到一个答案,直到我尝试这个技术。希望有人有这个问题发现这个答案有用。

z8dt9xmd

z8dt9xmd3#

使用${process.cwd()}对我很有效...您可以这样编写它

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

cnwbcb6i4#

如果你使用的是ubuntu机器,那么我们可能只有python3被默认添加到环境变量中。尝试将进程名从python更改为python3

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

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

相关问题