Question

Background

I have a Python project with this directory structure:

py/:
db/  __init__.py  run.py

py/db:
handle.py  __init__.py  util.py

The files are simple enough that I'm not sure I need to post them; nevertheless:

py/run.py

from db.handle import Handle

py/db/handle.py:

import util

class Handle:
    def __init__(self, x):
        self.x = util.addtwo(x)

py/db/util.py:

def addtwo(x):
    return x + 2

If I run handle.py from within the db subdirectory, it imports util without error. However, when I run run.py, handle.py fails with an import error. I can guess that handle.py is being run in the py directory (instead of py/db), and putting a call to os.getcwd() in handle.py confirms this. I can fix this problem using sys.path like so (in run.py):

import sys
sys.path.append("db")
from db.handle import Handle

Question

When importing, from a subdirectory, a module that contains imports to other local modules in that directory, why doesn't Python check the current directory of the module making the import statement? In my example, why doesn't Python check the db first when handle.py contains import statements? Is there a PEP that describes this or is it a behavior with an obvious rationale that I missed?

I thought it might be related to PEP 328:

all import statements be absolute by default (searching sys.path only) with special syntax (leading dots) for accessing package-relative imports.

but I'm not sure.

Was it helpful?

Solution

Your import is "absolute" and module names is looked for in the PYTHONPATH, and that typically includes the current directory.

If you want to import a module from the same folder that your module is in, you use a relative import:

from . import util

or

from .util import addtwo
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top