我尝试在节点脚本中调用一个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的值?),但我似乎不能解决这个问题。我已经查找了类似的问题,但答案没有帮助。
任何帮助都将不胜感激。:)
4条答案
按热度按时间fquxozlt1#
显然,问题出在cwd上。脚本中的所有内容都与调用脚本的目录 * 的路径有关。因此,基本上,从项目根目录运行
node myFunction.js
(比如~/projects/myProject
)会将cwd设置为~/projects/myProject/../folder
,而~/projects/myProject/../folder
的计算结果为~/projects/folder
。这显然是不正确的,因为很可能,no目录命名folder
exists on这系统,并且因此这将导致一个ENOENT
错误.解决方案是在代码中构造脚本的绝对路径,也许可以结合使用
__dirname__
属性和path
模块提供的功能。deyfvvtc2#
我为这个问题挣扎了好几天,才意识到我的脚本文件没有被nodeJS拾取和生成,因为一些
filepath
问题。虽然我不能保证这对每个人都有效,但这取决于他们的设置,这是我在nodejs文件中所做的:
如您所见,我不必使用
{cwd: '../folder/'}
选项。如果您的脚本作为javascript文件位于当前目录中,只需执行以下操作
我还要指出:
进程.spawn('python',['./pyscript.py']);
从来没有为我工作,我花了几天时间想知道为什么。可以找到一个答案,直到我尝试这个技术。希望有人有这个问题发现这个答案有用。
z8dt9xmd3#
使用${process.cwd()}对我很有效...您可以这样编写它
cnwbcb6i4#
如果你使用的是ubuntu机器,那么我们可能只有python3被默认添加到环境变量中。尝试将进程名从python更改为python3
到