osdir.com


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

python3 - Import python file as module


shivani.shinde at alefedge.com wrote:

> Hi,
> I am a beginner to Python. I want to achieve the following:
> 
> My directory structure:
> 
> a
> ??? b
>     ??? c
>         ??? p
>         ?   ??? q
>         ?       ??? test.py
>         ??? x
>             ??? y
>                 ??? run.py
> 
> In my run.py file, I want to import everything from test.py(contains
> methods).
> 
> I have found relative path for test.py as "....p.q".
> I tried with exec() to import as :  exec("from ....p.q import *"),
> but this gives me >> "list out of index" error.

I do not recognize that error. Is this cut-and-paste?

> Then I tried with importlib.import_module with various combinations such
> as: 1. importlib.import_module('.test', package="....p.q")
> 2. importlib.import_module('test', package="....p.q")
> 3. importlib.import_module('....p.q.test', package=None)

Why are you trying import_module() or exec() when you know the location of 
the module you want to import?
 
> But I end up getting error as >> No module found "".
> 
> Can anyone help me with this situation?

You need to make sure that a is in your sys.path and that the importing 
module is itself imported using the complete path. For example:

Given

$ tree
.
??? a
    ??? b
        ??? c
            ??? p
            ?   ??? q
            ?       ??? test.py
            ??? x
                ??? y
                    ??? run.py

7 directories, 2 files
$ cat a/b/c/p/q/test.pydef hello():
    print("Hello, world!")
$ cat a/b/c/x/y/run.py
from ...p.q.test import hello
hello()

you can run your run.py with

$ python3 -m a.b.c.x.y.run
Hello, world!

but not with

$ python3 a/b/c/x/y/run.py 
Traceback (most recent call last):
  File "a/b/c/x/y/run.py", line 1, in <module>
    from ...p.q.test import hello
SystemError: Parent module '' not loaded, cannot perform relative import

because here run.py is a standalone script from Python's point of view 
rather than part of a package hierarchy.

In general you can never go higher than the toplevel package, so this also 
fails:

$ cd a/b/c
$ python3 -m x.y.run
Traceback (most recent call last):
  File "/usr/lib/python3.4/runpy.py", line 170, in _run_module_as_main
    "__main__", mod_spec)
  File "/usr/lib/python3.4/runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "/home/petto/srcx/clpy/shivani/a/b/c/x/y/run.py", line 1, in <module>
    from ...p.q.test import hello
ValueError: attempted relative import beyond top-level package

While this works

$ cd ..
$ python3 -m c.x.y.run
Hello, world!

it is a good idea to decide on the root package once and for all, and then 
only import starting from that.