【问题标题】:Calling Python scripts from Java. Should I use Docker?从 Java 调用 Python 脚本。我应该使用 Docker 吗?
【发布时间】:2018-05-05 16:40:27
【问题描述】:

我们的项目中有一个 Java 应用程序,我们想要调用一些 Python 脚本并从中返回结果。最好的方法是什么?

我们希望隔离 Python 执行以避免影响 Java 应用程序。可能,Dockerizing Python 是最好的解决方案。我不知道还有什么办法。

那么,一个问题是如何从Java中调用它。

据我了解有几种方法:

  1. 在 Docker 中启动一些网络服务器,该服务器接受来自 Java App 的 REST 调用并运行 Python 脚本并通过 REST 将结果返回给 Java。

  2. 以某种方式通过 Docker CLI 处理请求和响应。

  3. 使用 Java Docker API 向 Docker 发送 REST 请求,然后由 Docker 转换为 Docker 内部 Python 脚本的 Stdin/Stdout。

在 Docker 中运行的 Java App 与 Python 连接最有效、最正确的方法是什么?

【问题讨论】:

  • 我认为在python中公开一个rest api并从java调用rest api会更好,因为不会有任何外部依赖(docker apis)。您以后可以从任何地方调用 rest api,而不仅仅是从 java 以备不时之需。
  • python 和 java 代码之间需要多少隔离?
  • 虽然您可以使用 REST,但我可能会建议一个可以为两种语言生成方法和客户端的 RPC 框架
  • jrtapsell,我不希望 Python 代码能够影响 Java App。在 CPU、RAM、文件系统访问方面,我的设置这两个部分应该是独立的。
  • 肯定会同意使用 RPC 进行跨语言 API 调用。

标签: java python docker


【解决方案1】:

您不需要 docker。有几个选项,您应该根据您的 Java 应用程序正在执行的操作进行选择。

  1. 如果 Java 应用程序是 客户端 - 基于 swing、weblaunch 或直接提供 UI - 您将希望将 python 功能封装在 REST/HTTP 调用中。

  2. 如果 Java 应用程序是 server/webapp - 在 Tomcat、JBoss 或其他应用程序容器中执行 - 您应该简单地将 python 脚本包装在 exec 调用中。为此,请参阅 Java Runtime 和 ProcessBuilder API。

【讨论】:

  • 我看不出有任何理由摇摆,或者其他,也不能使用 Python 脚本
  • 啊,我的意思是说客户端应用程序与服务器端。因此,如果您的应用程序在客户的笔记本电脑上运行,您真的不想为了这些琐碎的目的而在那里生成新进程。
  • 好吧,这样更有意义
  • 谢谢蒂米尔!我的应用程序是一个服务器,在某个应用程序容器上启动。我之所以要使用 Docker,是因为我的应用程序不应该依赖 Python 脚本执行结果。 Python 脚本可能会消耗所有内存、删除磁盘上的某些文件、消耗所有 CPU - 但主 Java 应用程序永远不会注意到这一点。这就是为什么我认为 Docker 是一个不错的选择。
【解决方案2】:

您可以尝试OpenFaas 将您的 python 脚本与顶部的网络服务器进行 dockerize。

您可以使用完整的 OpenFaas 堆栈来创建映射到单个容器的单个 API 函数,也可以仅使用 OpenFaas Web 组件。

一个简单的Dockerfile 可能是这样的:

FROM python:3.4-alpine

ADD . /workdir
WORKDIR /workdir

ADD https://github.com/openfaas/faas/releases/download/0.7.9/fwatchdog /usr/bin
RUN chmod +x /usr/bin/fwatchdog

ENV fprocess="python yourPythonScript.py"
CMD ["fwatchdog"]

构建并运行它:

$ docker build . -t dockerized-python-script
[....]
$ docker run -p 8080:8080 dockerized-python-script

您已准备好通过带有明文参数的 http 与您的脚本“对话”:

$ curl yourserver:8080 -d "param1 param2 param3"
Some output from your script

如果您想使用 JSON,您需要相应地修改 yourPythonScript.py 以管理输入和输出。

【讨论】:

    猜你喜欢
    • 2010-10-10
    • 1970-01-01
    • 2012-01-14
    • 1970-01-01
    • 2011-07-29
    • 2014-09-29
    • 2017-07-27
    • 2020-12-17
    相关资源
    最近更新 更多