我正试图从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导出查看器输出的图像,以供参考
编辑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特有的。在此方面的任何帮助也将不胜感激
目前没有回答
相关问题 更多 >
编程相关推荐