导出编译的.dll或.so文件以用于其他语言时,“初始化Julia运行时”是什么意思?

2024-10-01 00:29:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图从Julia编译一个可用的.dll文件,以便在Python中使用,因为我已经用Python编写了一个大型GUI,需要完成一些快速优化工作。通常我只会调用PyJulia或一些“live”调用,但是这个程序需要编译以在我的研究团队中分发,所以无论我最终得到什么解决方案,都需要能够独立运行(没有实际安装Julia或Python)

现在,我可以通过PackageCompiler.jl创建.dll文件,这是我从StackOverflow的前几篇文章中学到的,但是当我尝试通过以下代码在Python中运行这些文件时

Julia mock软件包


module JuliaFunctions
    # Pkg.add("BlackBoxOptim")
    Base.@ccallable function my_main_function(x::Cfloat,y::Cfloat)::Cfloat
        z = 0
        for i in 1:x
            z += i ^ y
        end
        return z
    end
    # function julia_main()
    #     print("Hello from a compiled executable!")
    # end
    export my_main_function

end  # module

使用PackageCompiler的脚本

# using PackageCompiler
using Pkg
# Pkg.develop(path="JuliaFunctions")  # This is how you add a local package
# include("JuliaFunctions/src/JuliaFunctions.jl")  # this is how you add a local module
using PackageCompiler

# Pkg.add(path="JuliaFunctions")
@time create_sysimage(:JuliaFunctions, sysimage_path="JuliaFunctions.dll")

尝试在Python的CTypes中使用生成的.dll

import ctypes
from ctypes.util import find_library
from ctypes import *

path = os.path.dirname(os.path.realpath(__file__)) + '\\JuliaFunctions.dll'

# _lib = cdll.LoadLibrary(ctypes.util.find_library(path))  # same error
# hllDll = ctypes.WinDLL(path, winmode=0)  # same error
with os.add_dll_directory(os.path.dirname(os.path.realpath(__file__))):
    _lib = ctypes.CDLL(path, winmode=0)

我明白了 OSError: [WinError 127] The specified procedure could not be found

根据我目前的理解,这意味着CTypes找到了dll并导入了它,但没有找到。。某物我还没有完全理解它的行为

我已经验证了函数my_main_function是通过Nirsoft's DLL Export Viewer导出到.dll文件中的。来自previous similar issues的用户注意到,这个系统映像已经可以调用,应该可以工作,但是他们总是在末尾添加一些类似于“注意,您通常还需要初始化Julia运行时”的内容

这是什么意思?这甚至可以独立于Julia安装完成吗?PackageCompiler中的dev docs提到了这一点,但是他们只是提到julia_main自动包含在.dll文件中,并作为一种启动点被调用。此函数也被正确导出到上述代码创建的.dll文件中。下面是Nirsoft导出查看器输出的图像,以供参考

Nirsoft .dll export viewer results

编辑1 令人费解的是,我在另一台机器上重建了这个.dll并取得了进展。现在,dll已正确导入。我还不确定为什么在新的juliainstall+pythonvenv上可以工作,但是我将在另一个上重新安装它们,如果有任何变化,我将更新它。对于遇到这种情况的任何人,也请注意,您需要指定预期的输出,不管它是什么。在我的例子中,这是通过添加(在导入之后)来完成的:

_lib.testmethod1.restype = c_double  # switched from Cfloat earlier, a lot has changed.
_lib.testmethod1.argtypes = [c_double, c_double]   # (defined by ctypes)

当前的错误现在是OSError: exception: access violation writing 0x0000000000000024当尝试实际使用函数时,这是Python特有的。在此方面的任何帮助也将不胜感激


Tags: 文件pathfromaddosmainfunctionpkg