[Tutor] Do not understand why test is running.

Steven D'Aprano steve at pearwood.info
Sun Aug 23 18:37:06 CEST 2015


On Sun, Aug 23, 2015 at 10:42:25AM -0500, boB Stepp wrote:

[...]
> If I try this or begin in E:\Projects\mcm and type py
> ./test/db/test_manager.py I get
> 
> E:\Projects\mcm>py ./test/db/test_manager.py
> Traceback (most recent call last):
>   File "./test/db/test_manager.py", line 16, in <module>
>     import mcm.db.manager
> ImportError: No module named 'mcm'
> 
> 
> I don't understand why this is the case.

Without seeing the complete structure of your project, I cannot be sure, 
but I can think of at least two problems:

1) Does the mcm directory contain a file called __init__.py? If not, 
then Python will not recognise it as a module and `import mcm` will 
fail.

2) Even if mcm contains a __init__.py file, the directory itself must be 
located in your PYTHONPATH. If you run this:

py -c "import sys; print(sys.path)"

it will show you the directories in the PYTHONPATH that are searched for 
a module called mcm. Given that your directory is E:\Projects\mcm, that 
implies that E:\Projects\ must be in the search path in order to locate 
mcm as a module.

Think of it this way... simplified (very simplified!) Python does this 
when you try to import a module:

# `import spam` pseudo-code
for directory in sys.path:
    filenames = os.listdir(directory)
    for name in filenames:
        if os.path.isfile(name) and name == "spam.py":
            load(directory\spam.py)
        elif os.path.isdir(name) and name == "spam":
            if os.path.exists(directory\spam\__init__.py):
                load(directory\spam\__init__.py)


There's more, of course -- the real import code is much more complex, it 
handles cached modules in sys.modules, compiled .pyc and .pyo files, zip 
files, custom importers, and much more. And I daresay it is more 
efficient than the pseudo-code I show above.

But the important factor is that none of the directories in the 
PYTHONPATH are themselves considered modules, only their contents can be 
considered modules. So, if the current directory is

E:\Projects\mcm

then that directory will be added to the PYTHONPATH, sure enough. But 
there is nothing inside that directory called mcm, you need either:

E:\Projects\mcm\mcm.py

or

E:\Projects\mcm\mcm\__init__.py

in order to import it. Or you can add E:\Projects to the PYTHONPATH. Or 
move up a level, to E:\Projects, and run your code from there.

To put it another way, Python will look *inside* the current directory 
for modules to import, but it won't look *at* the current directory as a 
module to import.


-- 
Steve


More information about the Tutor mailing list