在heroku上的nodejs中生成python脚本

tsn*_*ake 5 python heroku node.js

摘要问题:为什么 Heroku 指示os.system('say ...')“未找到”,我该如何解决?

我有一个 Node.js 应用程序,我child_process用来生成一个 Python 脚本,该脚本在给出特定单词时读出音频。我知道当我在 上运行我的服务器时它可以工作localhost:5000,但是当我在 Heroku 上部署它时,我在这篇文章底部的图片中出现错误。我曾尝试添加heroku/pythonbuildpack,但这也不起作用。

我在 Node.js 中的 JS 代码如下所示:

app.get('/perform/:word', readOut)
function readOut(req, res) {

    var spawn = require("child_process").spawn;

    var process = spawn('python', ["./readout.py", req.params.word]);

    res.send("Action completed!")
}
Run Code Online (Sandbox Code Playgroud)

请注意,“操作已完成”确实会发送回我的客户端,因此它正在运行代码。

我通过捕获stderr并将其打印到控制台来意识到存在错误。这仅发生在 Heroku 上,我不确定这意味着什么。我不太确定 python 脚本在正常工作时如何出错localhost,但话说回来,我认为缺乏认识是我的垮台所在。

这是我的 Python 文件的样子:

import os
import sys

os.system('say {}'.format(sys.argv[1]))
Run Code Online (Sandbox Code Playgroud)

错误信息是这样的:

stderr: sh: 1: say: not found
Run Code Online (Sandbox Code Playgroud)

有谁知道为什么 Heroku 会发生这种情况?我是否缺少某个包裹或任何东西?我如何让 Heroku 知道os.system()电话?

编辑:我实际上在 Python 脚本中添加了一段代码,上面写着

os.system('date')
Run Code Online (Sandbox Code Playgroud)

并且它正确地登录到标准输出。它必须是os.system('say').

Chr*_*ris 1

这里至少存在两个问题:

  1. 看起来 macOS 有一个say命令,但 Linux 上不存在。Heroku 不运行 macOS。

  2. 即使say 可用,也没有任何用处。它会尝试说出服务器上或某个数据中心中告诉它要说的任何内容。服务器可能没有播放任何音频的硬件,即使有,也没有人会听到。

    似乎只适用于您的本地计算机,因为您的客户端和服务器位于同一台计算机上。如果您希望在客户端计算机上听到某些内容,则必须使用客户端 JavaScript 来完成。

    请参阅客户端和服务器端编程有什么区别?

最后,Python 在这里没有做任何有用的事情。如果say可用并且执行了您想要的操作,您可以spawn()在 JavaScript 代码中使用 或 某些内容来调用它。