如何在 Heroku 中部署带有子进程 (python) 的 Node.js 应用程序?

How to deploy a Node.js application with a child process (python) in Heroku?

我正在尝试部署一个 Node.js 应用程序,其子进程 运行 是一种机器学习算法。我可以在本地使用它,但是当我尝试在 Heroku 服务器上 运行 时,我收到一些消息调用,其中缺少一些库,如下所示:

ModuleNotFoundError: No module named 'pandas'

我尝试手动创建 requirements.txt 并将必要的库放在那里:

pandas
pymongo
dnspython
scikit-learn      
scipy           
selenium
webdriver-manager
textblob

但是没用。我需要做一些额外的配置吗?

非常感谢您的帮助!

你的 Heroku dynos 运行 你的软件是通过一种叫做 buildpack 的东西的方式。

当您将应用程序部署到 Heroku 时,它会查看您的代码并尝试确定您使用的是哪种编程语言,然后基于此 运行 您的应用程序将使用相应的构建包。

例如,如果您将应用程序部署到 Heroku 并且该应用程序在项目目录的根目录中有一个 package.json 文件,Heroku 将假设您的应用程序是一个 JavaScript 应用程序并使用Node.js buildpack.

Buildpacks 包含许多预安装的依赖项。例如,Node.js 构建包包含 node(因此您可以 运行 您的 JavaScript 代码)以及一些 Linux 依赖项,以便您的应用程序将能够安装可能依赖于它们的通用 libraries/tools。

但是...此 buildpack 策略的一个缺点是,如果您要部署 Node.js 应用程序,例如,默认 Node.js 构建将不会随 Python 一起提供以及安装的各种 Python 库依赖项。这是因为 Heroku 支持许多不同的编程环境,如果只有一个 buildpack 就安装了所有东西,那将是 slow/complex。太疯狂了!

因此,在您的情况下,您需要做的是使用多个构建包! Heroku 有一种方法可以让您为您的应用程序启用多个构建包,这样您的应用程序就可以具有 Node.js 依赖项 以及 Python 依赖项,例如!

This article 在 Heroku 的文档站点上解释了如何为给定的应用程序使用多个构建包。

为简单起见,以下是具体说明:

# This command will set your default buildpack to Node.js
$ heroku buildpacks:set heroku/nodejs

# This command will set it up so that the Heroku Python buildpack will run first
$ heroku buildpacks:add --index 1 heroku/python

通过执行上述操作,您将能够让 Heroku 通过传统的 requirements.txt 文件安装您的 Python 依赖项,就像您使用任何普通 Python 应用程序一样。