Проблема с использованием pyimport в Julia 1.1.0 - PullRequest
2 голосов
/ 08 апреля 2019

Я сделал модуль с условием 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 - это строка в другом состоянии, соответствующая @pyimport scipy.signal as ss, а строка 30 соответствует if nworkers() > 1.

До этой проблемы в коде была проблема со строкой @everywhere @pyimport scipy.signal as ss, но она исчезла при использовании import PyCall;странно, однако, это не решило прежнюю проблему.

Кто-нибудь испытывал подобную проблему или знал о таких проблемах?

1 Ответ

1 голос
/ 09 апреля 2019

Вам нужно использовать pyimport function .Определение макроса (взято из using) и использование этого макроса в одном и том же блоке не работает из-за порядка разбора / оценки.

Просто измените код

@pyimport scipy.signal as ss

на

ss = pyimport("scipy.signal")

Вы также можете разделить блоки на два, первый для определений и второй для использования.Однако я бы не стал этого делать, поскольку @pyimport macro уже устарел.

...