How to import module in different folder?

Question:

I have this folder structure:

A
|---- B1
       |---- C1
              |---- D
                    |---- x.py
|---- B2
       |---- C2
              |---- main.py

and I want to import x.py when running main.py. I added

import sys,os
sys.path.append(os.path.dirname(os.path.abspath(os.path.dirname(__file__))))
from B1.C1.D import x

to main.py.

But I received a ModuleNotFoundError

How can I solve this error?

Asked By: SunHyeon Kwon

||

Answers:

Don’t run a script inside a package. Python files inside packages are intended to be imported, not to be run(*)

Instead, move the script into e.g. a scripts directory, then make sure the root directory of your package (A here) is on your PYTHONPATH or in a place that Python can find, and import x in the script like

from A.B1.C1.D import x

The file and directory layout would then be

BASE/scripts/main.py
BASE/A/B1/C1/D/x.py

and you run your script from BASE, with e.g. python scripts/main.py.


If you have another module elsewhere in the package, use a relative import. For example, if you have A/B2/C2/y.py, then import x as follows:

from ....B1.C1.D import x

Yes, that’s a horribly amount of leading dots, but that’s what you get for a deeply nested package structure.

Of course, in this case,

from A.B1.C1.D import x

also works in module y, not only in the script. But relative imports show how modules belong to the same package, and can potentially be handy in case you ever rename the package.

Scripts, on the other hand, are not part of the package. They may use the package, they may provide an executable wrapper around the package, but they should not be included in(side) the package.


*) disregard runnable modules here, because that’s clearly not what the question is about.

Answered By: 9769953

If your code is python2, you can add__ init__. py in D dir
__ init__. Py content is empty

Answered By: Recar
Categories: questions Tags:
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.