【问题标题】:How to deploy a Node.js application with a child process (python) in Heroku?如何在 Heroku 中部署带有子进程 (python) 的 Node.js 应用程序?
【发布时间】:2021-10-30 00:16:37
【问题描述】:

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

ModuleNotFoundError: No module named 'pandas'

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

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

但它不起作用。我需要做一些额外的配置吗?

非常感谢您的帮助!

【问题讨论】:

    标签: python node.js heroku child-process


    【解决方案1】:

    Heroku dynos 运行软件的方式是通过称为 buildpack 的东西。

    当您将应用程序部署到 Heroku 时,它会查看您的代码并尝试找出您使用的编程语言,然后基于此,将使用相应的 buildpack 运行您的应用程序。

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

    Buildpacks 包含许多预安装的依赖项。例如,Node.js buildpack 包含 node(因此您可以运行 JavaScript 代码)以及许多 Linux 依赖项,以便您的应用能够安装可能依赖它们的通用库/工具。

    但是...这种 buildpack 策略的一个缺点是,例如,如果您要部署 Node.js 应用程序,默认的 Node.js 构建将不会附带 Python 和安装的各种 Python 库依赖项。这是因为 Heroku 支持许多不同的编程环境,如果只有一个构建包安装了所有东西,它会很慢/很复杂。太疯狂了!

    因此,在您的情况下,您需要做的是使用多个构建包! Heroku 可以为您的应用启用多个构建包,以便您的应用可以拥有 Node.js 依赖项以及 Python 依赖项,例如!

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

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

    # 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 应用程序一样。

    【讨论】:

    • @rdegges buildpack 会自动在 git 存储库中查找 requirements.txt 吗?我问这个是因为我有这样的结构:server/src/venv/requirements.txt 和 server/src/pythonScript 中的 python 脚本。谢谢!
    • @PeterMalik 是的——buildpacks 将在特定位置(通常是项目的根目录)查找这些文件。这是一个限制。如果您不希望它以这种方式工作,则需要分叉 buildpack 然后修改它以查看其他地方 =/
    • @rdegges 谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-08
    • 1970-01-01
    • 2021-02-12
    • 2016-11-28
    • 1970-01-01
    相关资源
    最近更新 更多