我制作了一个带有if条件的模块,该模块的核心数量为
module mymodule
import Pkg
import PyCall
using Distributed
if nworkers() > 1
@everywhere using Pkg
@everywhere Pkg.activate(".")
@everywhere Pkg.instantiate()
@everywhere using PyCall
@everywhere @pyimport scipy.signal as ss
function parallel()
....
end
else
using Pkg
Pkg.activate(".")
Pkg.instantiate()
using PyCall
@pyimport scipy.signal as ss
function serial()
....
end
end
end #mymodule
代码在执行时引发以下错误
ERROR: LoadError: LoadError: UndefVarError: @pyimport not defined
Stacktrace:
[1] top-level scope
[2] include at ./boot.jl:326 [inlined]
[3] include_relative(::Module, ::String) at ./loading.jl:1038
[4] include(::Module, ::String) at ./sysimg.jl:29
[5] include(::String) at ./client.jl:403
[6] top-level scope at none:0
in expression starting at /storage/work/s/mymodule.jl:81
in expression starting at /storage/work/s/mymodule.jl:30
其中第81行是else条件下与@pyimport scipy.signal as ss
相对应的行,而第30行则与if nworkers() > 1
相对应。
在出现此问题之前,代码在行@everywhere @pyimport scipy.signal as ss
中存在问题,但是通过使用import PyCall
而消失了;奇怪的是,它没有解决前一个问题。
有人遇到类似问题或意识到此类问题吗?
答案 0 :(得分:1)
您需要改用pyimport
function 。宏定义(来自using
),并且由于解析/求值顺序而无法在同一块中使用该宏。
只需更改代码
@pyimport scipy.signal as ss
到
ss = pyimport("scipy.signal")
您还可以将块分为两个,第一个用于定义,第二个用于用法。但是,我不会这样做,因为它是@pyimport
宏is already deprecated.