在Julia 1.1.0中使用pyimport的问题

时间:2019-04-08 05:39:32

标签: julia

我制作了一个带有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而消失了;奇怪的是,它没有解决前一个问题。

有人遇到类似问题或意识到此类问题吗?

1 个答案:

答案 0 :(得分:1)

您需要改用pyimport function 。宏定义(来自using),并且由于解析/求值顺序而无法在同一块中使用该宏。

只需更改代码

@pyimport scipy.signal as ss

ss = pyimport("scipy.signal")

您还可以将块分为两个,第一个用于定义,第二个用于用法。但是,我不会这样做,因为它是@pyimportis already deprecated.