1

A similar question was asked at: Python subpackage import "no module named x" But I was still not able to solve my problem.

For the first time, I divided my python code into modules and packages. Here is how the files are set up (not with the real names):

└── projectfolder
    |––main.py
    |––package1
        |--__init.py__
        |--module1.py
        |--subpackage1
            |--__init.py__
            |--module2.py

Inside module2.py there is a function ("function1") that is supposed to be used inside a function ("function2") in module1.py. Function2 is then supposed to be used inside main.py.

This is firstly done by importing suppackage1 inside module1:

import subpackage1

This is the code inside the __init__.py inside subpackage1:

from .module2 import function1

Function1 is then used inside function2 which lies in module1.py like this:

subpackage1.function1()

Which does not create any error message. But now I want to call function2 in main.py. Package1 is imported in main.py like this:

import package1

This is the code inside the __init__.py file inside package1:

from .module1 import function2

I was then expecting that I could use function2 without a problem in main.py like this:

package1.function2()

But when running the code from main.py I get this error message:

Error:

"Inside main.py" import package1
"Inside __init__.py which lies in package1" from .module1 import function2
"Inside module1.py" ModuleNotFoundError: No module named 'subpackage1'

What have I done wrong? And is there a better way to organize packages and modules? Because this is already hard to manage only with a few files.

svfat
  • 3,273
  • 1
  • 15
  • 34
Leg5Table
  • 13
  • 3

2 Answers2

0

Briefly:

When you run main.py your subpackage1 is out of the scope, therefore you can't import it with import subpackage1. More info on this topic here.

Consider rewriting import subpackage1 like:

from package1 import subpackage1

Or add it to the PYTHONPATH env variable, but I personally find that way more confusing

svfat
  • 3,273
  • 1
  • 15
  • 34
0

From this answer, There is nothing like real sub‑package in Python, as all package references goes to a global dictionnary, only, which means there's no local dictionary, which implies there's is no way to manage local package reference.

You have to either use full prefix or short prefix or alias.