This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

Title: Unittest discover fails with namespace package if the path contains the string same as the module name
Type: behavior Stage:
Components: Tests Versions: Python 3.6, Python 3.4, Python 3.5
Status: closed Resolution: out of date
Dependencies: Superseder:
Assigned To: Nosy List: barry, eric.snow, rbcollins, toshishige hagihara
Priority: normal Keywords:

Created on 2015-05-12 01:14 by toshishige hagihara, last changed 2022-04-11 14:58 by admin. This issue is now closed.

Messages (5)
msg242929 - (view) Author: Toshishige Hagihara (toshishige hagihara) Date: 2015-05-12 01:14
There is a problem with unittest discovering with namespace packages.
Given the following directory structure, the following command fails with the errors.

# Directory Structure

    cybozu/   # <- namespace package

# Commands

# setup module path
echo /home/hagihara/test.cybozu/infra/forest/lib/python3 > sudo dd of=/usr/lib/python3/dist-packages/cybozu.pth
cd /home/hagihara/test.cybozu/infra
python3 -m unittest discover -s cybozu

# Errors

$ python3 -m unittest discover -s cybozu
Traceback (most recent call last):
  File "/usr/lib/python3.4/unittest/", line 221, in discover
AttributeError: 'module' object has no attribute '__file__'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/lib/python3.4/", line 170, in _run_module_as_main
    "__main__", mod_spec)
  File "/usr/lib/python3.4/", line 85, in _run_code
    exec(code, run_globals)
  File "/usr/lib/python3.4/unittest/", line 18, in <module>
  File "/usr/lib/python3.4/unittest/", line 92, in __init__
  File "/usr/lib/python3.4/unittest/", line 116, in parseArgs
  File "/usr/lib/python3.4/unittest/", line 225, in _do_discovery
    self.test =, self.pattern,
  File "/usr/lib/python3.4/unittest/", line 242, in discover
  File "/usr/lib/python3.4/unittest/", line 349, in _find_tests
  File "/usr/lib/python3.4/unittest/", line 310, in _find_tests
    name = self._get_name_from_path(full_path)
  File "/usr/lib/python3.4/unittest/", line 284, in _get_name_from_path
    assert not _relpath.startswith('..'), "Path must be within the project"
AssertionError: Path must be within the project

# Cause of the error

This error happens because does not set `self._top_level_dir` properly.

class TestLoader(object):
    def discover(self, start_dir, pattern='test*.py', top_level_dir=None):
        if os.path.isdir(os.path.abspath(start_dir)):
           # support for discovery from dotted module names
            except ImportError:
                is_not_importable = True
                    start_dir = os.path.abspath(
                except AttributeError:
                    # look for namespace packages
                    if spec and spec.loader is None:
                        if spec.submodule_search_locations is not None:
                            is_namespace = True

                            for path in the_module.__path__:
                                if (not set_implicit_top and
                                    not path.startswith(top_level_dir)):
                                self._top_level_dir = \                    <--- cause of the error.
                                         .replace(".", os.path.sep))[0])

If path of the module contains the string same as the module name,
the path is split at incorrect position and invalid value is set to `self._top_level_dir`.

path.split(the_module.__name__.replace(".", os.path.sep))[0]

the_module -> cybozu
cybozu.__path__ -> ['/home/hagihara/test.cybozu/infra/forest/lib/python3/cybozu']
path.split('cybozu')[0] -> '/home/hagihara/test.'
msg242930 - (view) Author: Eric Snow (eric.snow) * (Python committer) Date: 2015-05-12 02:06
Just in case, please take a look at issues #17457 and #23882 to see if they already cover the bug.
msg242932 - (view) Author: Toshishige Hagihara (toshishige hagihara) Date: 2015-05-12 02:39
Thanks for suggestion. I checked both issues and found that this bug is created in #17457 and #23882 does not fix it.
msg244847 - (view) Author: Barry A. Warsaw (barry) * (Python committer) Date: 2015-06-04 23:00
If you need a test case, try
msg275888 - (view) Author: Barry A. Warsaw (barry) * (Python committer) Date: 2016-09-11 23:43
I think this bug actually is fixed now.  I've tried my previously failing case in Python 3.5 and 3.6 head and I don't get the error.
Date User Action Args
2022-04-11 14:58:16adminsetgithub: 68356
2016-09-11 23:43:13barrysetstatus: open -> closed
resolution: out of date
messages: + msg275888
2015-08-23 23:50:44rbcollinssetversions: + Python 3.5, Python 3.6
2015-06-04 23:00:26barrysetmessages: + msg244847
2015-06-04 22:48:41barrysetnosy: + barry
2015-05-12 02:39:54toshishige hagiharasetmessages: + msg242932
2015-05-12 02:06:49eric.snowsetnosy: + eric.snow, rbcollins
messages: + msg242930
2015-05-12 01:14:38toshishige hagiharacreate