java - 从 Heroku 上的 Java/Kotlin 应用程序运行 Python 脚本

标签 java python heroku kotlin

我有一个 Java/Kotlin 应用程序,每次用户发出请求时都会运行 Python 脚本。

它在我的笔记本电脑和任何其他 VPS 上运行良好。但我无法让它在 Heroku 上运行。它不起作用并且不打印任何内容。

相关代码如下:

val command = "python3 $s/assets/script.py $params"
println("Command: $command")
val process = Runtime.getRuntime().exec(command)
process.waitFor()
val reader = BufferedReader(InputStreamReader(process.inputStream))
val message = reader.lines().collect(Collectors.joining("\n"))
println(message)

为什么这会在 Heroku 上失败?

最佳答案

Heroku 基于 buildpacks 构建应用程序。每个构建包都知道如何构建某种类型的项目,例如一个人可能知道如何安装 Maven 依赖项并编译 Kotlin 源代码,而另一个人可能知道如何安装 Ruby gems。

在简单的情况下,开发人员不需要太担心这一点。当未明确请求构建包时,Heroku tries to infer which buildpack it should use 。基本上,它按给定顺序迭代官方支持的构建包,并使用每个构建包的 detection script查看项目是否与该构建包匹配。

一旦找到匹配的构建包,它就会停止查找。在简单的情况下,这通常就足够了。但每个构建包都旨在生成相当精简的图像;您可能期望在常规 Linux 机器上存在的工具不一定存在。特别是,Java/Kotlin 构建包不会为您提供 python 二进制文件。

好消息是,通过一些配置,您可以使用 multiple buildpacks .

  1. 首先,设置您的主构建包:heroku buildpacks:set heroku/java
  2. 然后,添加辅助构建包:heroku buildpacks:add --index 1 heroku/python
  3. 使用 heroku buildpacks 确保您的 buildpack 以正确的顺序显示(首先是 Python,然后是 Java)

    The last buildpack in the list will be used to determine the process types for the application. Any process types defined from earlier buildpacks will be ignored.

  4. 最后,您可能需要添加一个空的 requirements.txt 文件以防止 Python buildpack 无法运行。或者,您可以添加您可能拥有的任何 Python 依赖项。

    如果您确实有 Python 依赖项,请考虑使用 PipfilePipfile.lock 而不是 requirements.txt。这将导致您的应用使用 pipenv 而不是 pip 构建。

关于java - 从 Heroku 上的 Java/Kotlin 应用程序运行 Python 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52347984/

相关文章:

python - 解析为 Firebase 增强型推送通知

ruby-on-rails - 如何将 force_ssl 与 302 一起使用

laravel - 响应 header 名称 'Access-Control-Allow-Origin ' 包含无效字符,中止请求

java - 数据库中存在缓慢问题的 Java 对象列表

java - TopCoder 使用离线可视化工具进行割草挑战

Java 相当于 python 的 String lstrip()?

node.js - 解析服务器云代码和 strip

java - 如何将表单数据上传到谷歌应用引擎

python - 使用定界符从列表中提取数据

python - 使用 python install 命令出现超时消息