我试图将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的值可能是?)但我似乎无法解决这个问题。我查了类似的问题,但答案没有帮助。
任何帮助将不胜感激。 :)
答案 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`]});