Stream: helpdesk (published)

Topic: ✔ PythonCall: Importing module with submodule


view this post on Zulip Jesper Stemann Andersen (Apr 30 2023 at 08:38):

Using PythonCall, suppose I would like to import a Python module foo and its sub-module bar, where bar defines baz, I would expect the following to work but it does not:

using PythonCall

foo = pyimport("foo")
foo.bar.baz

foo.bar is a Python module (a Py object), but it does not have baz defined - it doesn't seem to have any names defined.

Current workaround seems to be something like:

using PythonCall

foo = pyimport("foo")
foo_bar = pyimport("foo.bar")
foo_bar.baz

view this post on Zulip Jesper Stemann Andersen (Apr 30 2023 at 08:54):

julia> using PythonCall

julia> fo = pyimport("fiftyone")
Python module: <module 'fiftyone' from '/Users/jsa/work/julia/FiftyOne.jl/.CondaPkg/env/lib/python3.11/site-packages/fiftyone/__init__.py'>

julia> fo.core
Python module: <module 'fiftyone.core' from '/Users/jsa/work/julia/FiftyOne.jl/.CondaPkg/env/lib/python3.11/site-packages/fiftyone/core/__init__.py'>

julia> fo.core.

No names defined in fo.core, i.e. no completions available in the REPL.

Whereas all the names are defined if importing fiftyone.core separately:

julia> fo_core = pyimport("fiftyone.core")
Python module: <module 'fiftyone.core' from '/Users/jsa/work/julia/FiftyOne.jl/.CondaPkg/env/lib/python3.11/site-packages/fiftyone/core/__init__.py'>

julia> fo_core
Python module: <module 'fiftyone.core' from '/Users/jsa/work/julia/FiftyOne.jl/.CondaPkg/env/lib/python3.11/site-packages/fiftyone/core/__init__.py'>

julia> fo_core.
__annotations__    __cached__         __class__          __delattr__        __dict__           __dir__            __doc__            __eq__             __file__           __format__
__ge__             __getattribute__   __getstate__       __gt__             __hash__           __init__           __init_subclass__  __le__             __loader__         __lt__
__name__           __ne__             __new__            __package__        __path__           __reduce__         __reduce_ex__      __repr__           __setattr__        __sizeof__
__spec__           __str__            __subclasshook__   aggregations       annotation         brain              clips              collections        config             context
dataset            document           evaluation         expressions        fields             frame              frame_utils        groups             json               labels
logging            media              metadata           models             odm                patches            plots              runs               sample             service
session            singletons         spaces             stages             state              uid                utils              validation         video              view

view this post on Zulip Jesper Stemann Andersen (May 05 2023 at 11:03):

Seems like the names are indeed there - they are returned by getpropertynames(fo.core) - just that they somehow are not available from the REPL...

view this post on Zulip Notification Bot (May 05 2023 at 11:03):

Jesper Stemann Andersen has marked this topic as resolved.


Last updated: Dec 28 2024 at 04:38 UTC