使用Python类的init函数中的Julia对象

3
我想在Python代码中调用一个Julia脚本。使用pyjulia没有问题,但如果我将其设计为类,则会出现问题。我希望初始化Julia并在init函数中包含脚本。下面是我如何实现的示例,但我不能在函数中使用self.jul。它会抛出错误,因为self.jul没有"myJulFuntion"函数。我确定它在Julia脚本中,因为如果我将东西从init移到callJulFunc并调用jl.myJulFuntion(params),它可以正常工作。
有什么建议吗?
import julia
julia.Julia()
from julia import Main as jl


class juliaStuff:
    def __init__(self):
        self.jul = jl
        jl.include("my-julia-script.jl")
     # or as alternative try
        self.jul.include("my-julia-script.jl")

    def callJulFunc(self, params ):
        return self.jul.myJulFuntion(params)

编辑:我调整了我的代码。现在,当jl.include("my-julia-script.jl")或替代行出现时,它会在没有错误的情况下崩溃。

@Hugo Trentesaux:在您的代码中没有julia.Julia()初始化。对于我来说,即使没有这个,它也无法工作。

我的python版本是3.8.5,julia版本为1.5.2。

编辑2:我的问题是,我正在使用Django框架。运行此代码的简短示例很好,但将其作为从views.py调用的实现会在init中包含后导致Django进程崩溃。仅在函数中作为jl和调用julia导入Main不是问题。

因此,在我的views.py中,我添加了以下内容:

# at the top of the file
import juliaStuff as ju

# in a function
jul= ju.juliaStuff()
jul_res = jul.callJulFunc(params)

1
为什么你要两次赋值 self.jul?我对 Julia 一无所知,但这看起来至少很奇怪。 - Daniel Junglas
1
你能澄清一下你到底想做什么吗?从 Python 设计的角度来看,把“jl”视为黑盒子,这看起来非常不对。由于“jl”似乎是一个全局对象,将其分配为属性“self.jul”是误导性的——类应该只使用全局的“jl”。同样,如果“jl.include('my-julia-script.jl')”在“juliaStuff.__init__”内部引发错误,则它也会在外部引发错误。似乎 [mcve] 根本不包括类;虽然它很可能包括最少的 Julia 代码。 - MisterMiyagi
1个回答

2
尝试将您的Julia导入移出类构造函数,并且不要将self.jul设置为jl.include的输出结果。
# in script.jl
function hello()
 return "hello"
end

# in code.py
import julia
julia.Julia()
from julia import Main as jl

class juliaStuff:
    def __init__(self):
        self.jul = jl
        jl.include("script.jl")

    def callJulFunc(self):
        return self.jul.hello()

obj = juliaStuff()

print(obj.callJulFunc())

调用Python代码会在终端上打印“hello”。

2
请提供更多细节说明哪些部分出现了问题,因为我展示的代码在我的环境中是可以正常工作的。请提供一个最小化(不)工作示例,包括您的Julia脚本。 - Hugo Trentesaux
Hugo,感谢您的建议,我编辑了问题并添加了更多内容。您的代码运行良好,但在Django中不起作用。 - theother
你真正想做什么?看起来我们陷入了一个 xyz 问题。我也熟悉 Django,但我不明白你打算如何使用它。 - Hugo Trentesaux
请问您能否尝试从Django视图中调用您的code.py文件?例如通过单击按钮来实现。在这种情况下,我猜您会看到与我一样的问题。 - theother

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