daydreamingwill
daydreamingwill

Reputation: 323

How to import a file from a package which is importing another file from the same package

I've been working on a project where I have a file which needs to call a function from a file in a sub package/directory, which in turn is calling a function from another file in the same sub package. As such, I have a main file which is importing a sub file. This sub file is also importing another sub file which is in the same package.

The first sub file has no issue whatsoever importing the second sub file. The main file also has no issue importing the first sub file. However, when I put it all together and run the main file, Python thinks that the second sub file doesn't exist, which I find strange. I've simplified and visualised my problem with an example below:

I have the following file hierarchy:

test_package\
    __init__.py
    main_file.py
    test_sub_package\
        __init__.py
        subfile1.py
        subfile2.py

main_file code:

import test_sub_package.subfile1

subfile1 code:

import subfile2

subfile2 code:

def get_string():
    return ("Hello, World!")

So, I would expect main_file to import subfile2 via subfile1. However this doesn't seem to be the case because I get an error:

Traceback (most recent call last):
  File "...\Test\main_file.py", line 1, in <module>
    import test_package.subfile1
  File "...\Test\test_sub_package\subfile1.py", line 1, in <module>
    import subfile2
ModuleNotFoundError: No module named 'subfile2'

I was a little surprised that I got this error before I even attempted to call the functionality in subfile2. Either way, I'm confused why this doesn't work. Am I just doing something stupid here or am I trying to do something Python fundamentally doesn't support. If anyone can give me a solution it would be most appreciated.

I suspect this is probably a duplicate but I couldn't find an answer to my specific problem. So, sorry in advance.

Upvotes: 0

Views: 261

Answers (2)

tim-mccurrach
tim-mccurrach

Reputation: 6845

When you import a module into another module from the same directory you must use must use a relative import in subfile1.py you will need to write:

from . import subfile2

Note, that doesn't give subfile 1 access to get_string to use it in subfile1, you would need to either write subfile2.get_string() or import it directly with:

from .subfile2 import get_string

I have tried this out and it works, I hope this helps :)

Note: that, if you are running a python script, and you need to import a module in that same directory, you can just say import module_name. It makes a difference if it is a script you are running, or a module that is being used in some other script. For a detailed explanation as to why see here

(I assume from your error message that you want to run main.py, if this is not the case you will need to change import test_sub_package.subfile1 to from . import test_sub_package.subfile1)

Upvotes: 2

GarfieldCat
GarfieldCat

Reputation: 389

main file should be:

from test_sub_package.subfile1 import get_string
get_string()

subfile1.py

import test_sub_package.subfile2

Upvotes: 1

Related Questions