请问下 Java 如何调用含有第三方依赖的 Python 项目

2023-12-26 15:58:22 +08:00
 Haku

公司想搞 AI 相关的,但老企业用的全是 java ,结果就是要用 java 调 python 。

目前只能搞成 java 调 python 打包的 exe 。

也想过用 JNI-CPython-Python 的思路,但是解决不了 python 依赖大量第三方库的问题,没法把 python 代码包括第三方依赖一起给打包成 so 文件。

想问问有没有技术大佬有啥解决思路或者方案。

6339 次点击
所在节点    Python
77 条回复
Haku
2023-12-26 16:31:21 +08:00
对了还有个要求,不准直接带来或者改变服务器上的 python 环境。这个也是个坑点,导致我们也没法直接部署 python 代码而使用了 exe 让它可以脱离环境使用。
vicalloy
2023-12-26 16:31:39 +08:00
进程间通信总共也就这么几种方法。要不你们用共享内存吧。
lujiaxing
2023-12-26 16:31:52 +08:00
啥? 这算啥问题, 调 py 脚本难道不就是命令行不就完了么?
Haku
2023-12-26 16:32:07 +08:00
@lsk569937453 差不多是这样的,很离谱但是就是如此。
yushenglin
2023-12-26 16:33:01 +08:00
有任务队列么,封装一个订阅任务区处理
sujin190
2023-12-26 16:33:39 +08:00
@Haku #17 不可以开端口,难道也不可以开 pipe 么?还有 IPC 通信共享内存什么的吧,也没说一定要使用网络才能搞 RPC ,windows 还有更变态的直接用进程 ID 远程写进程内存然后通过内核信号量通知进程执行远程调用的
Haku
2023-12-26 16:34:17 +08:00
@nagisaushio 这个我不太熟悉,我看看哈
Ayanokouji
2023-12-26 16:34:27 +08:00
容器也不行吗
nagisaushio
2023-12-26 16:35:41 +08:00
@Haku "不准直接带来 python 环境"什么意思,我把依赖库打包成 zip 算吗?
Haku
2023-12-26 16:36:33 +08:00
@lujiaxing 部署服务器上没有我们需要的 python 环境,所以跑不动 py 脚本。
@sujin190 pipe 这块不太熟,我看看哈。共享内存已经在考虑了。
Haku
2023-12-26 16:37:46 +08:00
@nagisaushio 不解压就不算,解压哪怕用了虚拟环境也不行。
Haku
2023-12-26 16:40:03 +08:00
@yushenglin 这个其实也算可以,不过被使用方否决了,
@Ayanokouji 我记得和容器通信需要搞端口映射吧,因为最终还是要给 java 进程用的,java 进程不是我们写的,所以这个也不让用。
thinkershare
2023-12-26 16:43:09 +08:00
每个操作系统都有自己原生的多进程通讯模式,将你的 java/python 搞成多进程架构就行,Java 这边做主进程,负责管理和分发任务给 python 这边。python 是一定需要虚拟机的,不用虚拟机的 python 基本上啥也干不了,没几个库兼容,所以就将环境全部打包进入好了。
Ayanokouji
2023-12-26 16:43:39 +08:00
@Haku java 不是你们写的,就难办了,graalvm 估计调用方也不会用,还要安装新的 jdk 环境,按这描述只能进程间通信了吧
Ayanokouji
2023-12-26 16:48:53 +08:00
@Haku 我说的容器,当成 k8s 里边的 pod 理解,把 java 和 python 放到一个 pod 里边,docker 的话就是一个 compose ,设置下网络策略。在一个 pod 里边用 http 访问。不过按你这描述,容器应该也不会让你们用。
Haku
2023-12-26 16:51:48 +08:00
@Ayanokouji 理解了。这样确实不行,java 那边不会挪窝的,我们这边最多就是提供点 jar 包做层封装让他们不直接接触 python 这边的东西。
NessajCN
2023-12-26 16:56:50 +08:00
你们编的啥安全策略还禁 localhost 访问的?需要特意改安全策略才允许 localhost 端口访问?
Haku
2023-12-26 17:02:32 +08:00
@NessajCN 是你可以访问,但是你访问前要给安全过一堆检查,还要写申请,开策略。是“非技术”方面的禁止而非“技术”方面的。但是你不涉及任何网络方面的东西的话,以上冗杂的流程就没了,而目前就是希望别走这个流程。
mightybruce
2023-12-26 17:02:58 +08:00
那么多 IPC 的通信方式, 你选一种就行。 简单点就是 unix domain socket, 复杂点搞共享内存、POSIX 消息队列。像这种通信有很多开发库都封装了,比如 zeromq , 自己多试试吧。
hellomsg
2023-12-26 17:09:38 +08:00
给 zfu 外包吗?这么奇葩

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1003544

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX