JuliaPy / PyCall.jl

Package to call Python functions from the Julia language
MIT License
1.45k stars 186 forks source link

Error when importing Python modules in Package namespace #1008

Open renatobellotti opened 1 year ago

renatobellotti commented 1 year ago

Hi,

I'm trying to write a standalone package that uses PyCall. I thought importing Python modules only once into the global namespace of the package MyPackage would be beneficial for performance. This works when executed in a Jupyter notebook, but not in a separate package.

Here is the code of the package MyPackage:

module MyPkg

using PyCall
np = pyimport("numpy")

function my_code(a)
    return np.mean(a)
end

function my_code2(a)
    np = pyimport("numpy")
    return np.mean(a)
end

end

Install the package and then execute the following in a Jupyter notebook:

using MyPkg

MyPkg.my_code([1., 2.])

Error message:

ArgumentError: ref of NULL PyObject

Stacktrace:
 [1] _getproperty(o::PyCall.PyObject, s::Symbol)
   @ PyCall ~/.julia/packages/PyCall/ygXW2/src/PyCall.jl:299
 [2] __getproperty
   @ ~/.julia/packages/PyCall/ygXW2/src/PyCall.jl:312 [inlined]
 [3] getproperty(o::PyCall.PyObject, s::Symbol)
   @ PyCall ~/.julia/packages/PyCall/ygXW2/src/PyCall.jl:318
 [4] my_code(a::Vector{Float64})
   @ MyPkg ~/.julia/packages/MyPkg/3Tsby/src/MyPkg.jl:9
 [5] top-level scope
   @ In[3]:1
 [6] eval
   @ ./boot.jl:368 [inlined]
 [7] include_string(mapexpr::typeof(REPL.softscope), mod::Module, code::String, filename::String)
   @ Base ./loading.jl:1428

However, this works:

using MyPkg

MyPkg.my_code2([1., 2.])

This also works:

include("<path>/MyPkg.jl")
MyPkg.my_code([1., 2.])

I suspect that the precompilation is somehow interfering, but I know far too little about how imports work in Julia or how PyCall works to be sure.