Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python unittest failing to resolve import statements

I have a file structure that looks like the following

project
    src
        __init__.py
        main.py
        module.py
        secondary.py
    test
        test_module.py        

module.py

import secondary
x = False

secondary.py

pass

test_module.py

from unittest import TestCase

from src import module

 class ModuleTest(TestCase):
    def test_module(self):
        self.assertTrue(module.x)

Invoking python3 -m unittest discover in /project/ gives an error:

 File "/Users/Me/Code/project/test/test_module.py", line 6, in <module>
  from src import module
 File "/Users/Me/Code/project/src/module.py", line 1, in <module>
  import secondary
ImportError: No module named 'secondary'

What can I do so that secondary.py is imported without error?

like image 510
Max Bo Avatar asked Jan 25 '16 07:01

Max Bo


1 Answers

In Python 3 (and Python 2 with from __future__ import absolute_import), you must be explicit about what module you want when importing another module from the same package. The syntax you're using in module.py (import secondary) only works if secondary is a top-level module in a folder in the Python module search path.

To explicitly request a relative import from your own package, use from . import secondary instead. Or, make an absolute import, using the name of the package as well as the module (from src import secondary, or import src.secondary and use src.secondary elsewhere the module instead of just secondary).

like image 157
Blckknght Avatar answered Oct 13 '22 14:10

Blckknght