# PyCall @pyimport from scipy.stats import norm

**URL:** <https://discourse.julialang.org/t/pycall-pyimport-from-scipy-stats-import-norm/116009>\
**Category:** General Usage\
**Tags:** question\
**Created:** [June 22, 2024, 4:37am UTC](https://discourse.julialang.org/t/pycall-pyimport-from-scipy-stats-import-norm/116009 "2024-06-22T04:37:49Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![VinodV](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/vinodv/32/32733_2.png) [@VinodV](https://discourse.julialang.org/u/VinodV)\
**Post date:** [June 22, 2024, 4:37am UTC](https://discourse.julialang.org/t/pycall-pyimport-from-scipy-stats-import-norm/116009/1 "2024-06-22T04:37:49Z")

</div>

```julia
using PyCall 
@pyimport from scipy.stats import norm

```

Giving error:

```julia
ERROR: LoadError: ArgumentError: usage @pyimport module [as name]
Stacktrace:
 [1] pyimport_name(name::Symbol, optional_varname::Tuple{Expr, Expr})
   @ PyCall C:\Users\abcdef\.julia\packages\PyCall\1gn3u\src\PyCall.jl:585
 [2] var"@pyimport"( __source__ ::LineNumberNode, __module__ ::Module, name::Any, optional_varname::Vararg{Any})
   @ PyCall C:\Users\abcdef\.julia\packages\PyCall\1gn3u\src\PyCall.jl:598
in expression starting at REPL[26]:1

```

How the import should be done?

---

<div class="post-metadata">

**Author:** ![Satvik](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/satvik/32/20486_2.png) [@Satvik](https://discourse.julialang.org/u/Satvik)\
**Post date:** [June 22, 2024, 4:56am UTC](https://discourse.julialang.org/t/pycall-pyimport-from-scipy-stats-import-norm/116009/2 "2024-06-22T04:56:51Z")

</div>

This will work: `norm = pyimport("scipy.stats.norm")`

So will this: `@pyimport scipy.stats.norm as norm`

---

<div class="post-metadata">

**Author:** ![raman\_kumar](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/raman_kumar/32/26782_2.png) [@raman\_kumar](https://discourse.julialang.org/u/raman_kumar)\
**Post date:** [June 22, 2024, 5:01am UTC](https://discourse.julialang.org/t/pycall-pyimport-from-scipy-stats-import-norm/116009/3 "2024-06-22T05:01:30Z")

</div>

This might be of help [Modules · The Julia Language](https://docs.julialang.org/en/v1/manual/modules/#Module-initialization-and-precompilation)

---

<div class="post-metadata">

**Author:** ![Benny](https://avatars.discourse-cdn.com/v4/letter/b/49beb7/32.png) [@Benny](https://discourse.julialang.org/u/Benny)\
**Post date:** [June 22, 2024, 5:11am UTC](https://discourse.julialang.org/t/pycall-pyimport-from-scipy-stats-import-norm/116009/4 "2024-06-22T05:11:42Z")

</div>

> [@VinodV](#):
>
> `@pyimport from scipy.stats import norm`

Macros work on Julia syntax, that is too Python, hence the deviation in usage. Hypothetically, arbitrary syntax could be written in the string and parsed by a function or string literal macro, but that didn’t happen.

From the docstring: “`@pyimport module as name` is equivalent to `const name = pywrap(pyimport("module"))`.” The `pywrap` is needed to make a Julia module with member access, which the `pyimport` output lacks. `norm` is not a Python module however, `stats` is.

---

<div class="post-metadata">

**Author:** ![VinodV](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/vinodv/32/32733_2.png) [@VinodV](https://discourse.julialang.org/u/VinodV)\
**Post date:** [June 22, 2024, 5:23am UTC](https://discourse.julialang.org/t/pycall-pyimport-from-scipy-stats-import-norm/116009/5 "2024-06-22T05:23:28Z")

</div>

> [@Satvik](#):
>
> norm = pyimport(“scipy.stats.norm”)

```julia
julia> norm = pyimport("scipy.stats.norm")
ERROR: PyError (PyImport_ImportModule

The Python package scipy.stats.norm could not be imported by pyimport. Usually this means
that you did not install scipy.stats.norm in the Python version being used by PyCall.

```

---

<div class="post-metadata">

**Author:** ![VinodV](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/vinodv/32/32733_2.png) [@VinodV](https://discourse.julialang.org/u/VinodV)\
**Post date:** [June 22, 2024, 5:26am UTC](https://discourse.julialang.org/t/pycall-pyimport-from-scipy-stats-import-norm/116009/7 "2024-06-22T05:26:38Z")

</div>

A workaround 🙂

```julia
julia> py"""
       from scipy.stats import norm
       def pynorm(x):
           return norm.cdf(x)
       """

julia> py"pynorm"(-1)

```

---

<div class="post-metadata">

**Author:** ![Satvik](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/satvik/32/20486_2.png) [@Satvik](https://discourse.julialang.org/u/Satvik)\
**Post date:** [June 22, 2024, 5:28am UTC](https://discourse.julialang.org/t/pycall-pyimport-from-scipy-stats-import-norm/116009/8 "2024-06-22T05:28:31Z")

</div>

Oh, I didn’t realize `norm` isn’t a package. In that case you could do ` @pyimport scipy.stats as stats` and `stats.norm`

---

<div class="post-metadata">

**Author:** ![Benny](https://avatars.discourse-cdn.com/v4/letter/b/49beb7/32.png) [@Benny](https://discourse.julialang.org/u/Benny)\
**Post date:** [June 22, 2024, 5:32am UTC](https://discourse.julialang.org/t/pycall-pyimport-from-scipy-stats-import-norm/116009/9 "2024-06-22T05:32:22Z")

</div>

I’d hazard a guess at the equivalent to `from scipy.stats import norm` being `const norm = pywrap(pyimport("scipy.stats")).norm`. But I wouldn’t want to lose the Julia module without a reference, I don’t think a repeat call is as smooth as another import statement in Python.
