使用Julia依赖项分发一个独立的Python软件

8

我有一个软件,大部分是用Python编写的,现在我正在使用PyInstaller以用户友好的方式打包和分发软件(这是我的CI管道的一部分,适用于Linux和Windows)。

然而,我的性能非常糟糕,我想重写一些繁重的部分用Julia来实现,同时保持Python的前端。我可以使用PyJulia来做到这一点,但这意味着用户必须手动安装Julia才能使用我的程序。

Julia确实有与PyInstaller相当的工具,即PackageCompiler.jl,但我不知道如何从Python端调用使用PackageCompiler.jl编译的内容。

我该如何让这个工作,以便我可以打包和分发一个包含Python、Julia和运行所需的所有内容的可执行文件?


更多细节

我的最终用户是一些(化学家和药剂师),他们不知道什么是编程。他们没有Python、Julia或Docker(他们甚至不想安装它)。

在我的当前方法中,使用PyInstaller打包的软件由一个单一的可执行文件组成,其中包含了所有内容(Python和它所需的一切)。我真正想要的是保持相同的用户体验,但同时也运行Julia背景程序。

我将在Julia端实现几个函数,并希望(几乎)获得与PyJulia相同的集成水平。

也许我会转向Rust并只使用C接口,但我真的想使用Julia。

感谢大家的时间。


Docker 对你来说是否是一个选择? 如果 Julia 部分的启动时间对你很重要,那么通常只需要使用 PackageCompiler,否则更容易依赖于 Pkg 安装 Julia 部分。 - lungben
@lungben 我不能依赖Pkg,因为它在用户的机器上不存在。出于同样的原因,Docker也没有帮助,因为理想情况下,我的最终用户不知道它是什么。 - Héliton Martins
如果您不需要支持Windows,Nix将非常适合提供一个类似于Python虚拟环境的单一工具,但能够安装和管理任何组合的C、Rust、Python、Julia等软件。另一方面,如果您没有IT支持能力为用户安装Docker,安装Nix(或解决操作系统更新导致的问题)可能是不合理的要求。 - Charles Duffy
2个回答

0

是的,我知道这些解决方案,但在这种情况下,我只能有julia_main()入口点,这并不好。我正在寻找更像PyJulia(但已编译)的东西。 - Héliton Martins
@HélitonMartins 如果您不想构建一个“应用程序”,而是要构建一个“库”,然后使用ctypes直接从Python中调用它。但您需要使用Base.@ccallable函数包装Julia包函数。这可以通过元编程以编程方式完成。 - HarmonicaMuse

0
你可以尝试使用JuliaWin。它提供了一个独立的Julia运行时,完全自包含。
我们使用PyInstaller部署了一个工具,其中JuliaWin作为其中一个“datas”被调用。我记得在我们的情况下不是PyJulia,而是JuliaCall+PythonCall进行接口处理。
不幸的是,启动时间非常长(几分钟的顺序)。这部分是由于Julia的启动时间,但主要是由于生成的.exe首先必须解压缩JuliaWin。因此,我们目前正在调查使用PackageCompiler,可能还会切换到向用户提供2个文件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接