使用节点子进程生成python enoint错误

使用节点子进程生成python enoint错误,python,node.js,child-process,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 => {

我试图将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;
当我直接运行node myFunction.js(脚本中有一个myFunction实例)时,这段代码可以正常工作,当我需要在与myFunction.js相同的目录中的任何其他文件中使用该模块时,这段代码也可以正常工作

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

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


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

显然,问题在于cwd。脚本中的所有内容都与调用脚本的目录的路径相关。基本上,从项目根目录运行
节点myFunction.js
(假设
~/projects/myProject
会将cwd设置为
~/projects/myProject//文件夹
,这将计算为
~/projects/folder
。这显然是不正确的,因为在所有情况下,系统上都不存在名为
文件夹
的目录,因此这将导致
eNot
错误


解决方案是在代码中构造脚本的绝对路径,可能是通过使用
\uuu dirname\uuu
属性以及
path
模块提供的功能来实现。

显然,问题在于cwd。脚本中的所有内容都与sc所在目录的路径相关因此,基本上,从项目根目录运行
节点myFunction.js
(假设
~/projects/myProject
会将cwd设置为
~/projects/myProject//文件夹
,这将计算为
~/projects/folder
。这显然是不正确的,因为在所有情况下,系统上都不存在名为
文件夹
的目录,因此这将导致
eNot
错误


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

在意识到我的脚本文件没有被nodeJS提取和生成之前,我已经为这个问题挣扎了好几天,因为一些
文件路径
问题

虽然我不能保证这对每个人都有效,但这取决于他们的设置,这是我在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'])


我从来没有为我工作过,我花了好几天时间想知道为什么。在我尝试这种技术之前,我一直在寻找答案。希望有这个问题的人觉得这个答案有用。

我为这个问题挣扎了好几天,才意识到我的脚本文件没有被nodeJS提取和生成,因为一些
文件路径
问题

虽然我不能保证这对每个人都有效,但这取决于他们的设置,这是我在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'])

从来没有为我工作过,我花了好几天时间想知道为什么。在我尝试这种技术之前,我可以找到一个答案。希望有这个问题的人觉得这个答案有用。

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

let py = process.spawn('python', [`${process.cwd()}/folder/pyscript.py`]});
使用${process.cwd()}对我很有效……您可以这样编写它

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

。/folder/pyscript.py
是一个相对路径,当然它取决于正确的cwd。您尝试过绝对路径吗?我想我在问这个问题时错过了您的评论,但您可能是正确的。我将为我自己的问题添加一个答案,以帮助将来的提问者。谢谢!)
。/folder/pyscript.py
是一个相对路径,当然它取决于正确的cwd。你尝试过绝对路径吗?我想我问这个问题时错过了你的评论,但你可能是对的。我会为我自己的问题添加一个答案,以帮助任何未来的提问者。谢谢!:)那很有帮助…谢谢那很有帮助…谢谢