[Pytest-commit] Issue #478: --pyargs does not understand namespace packages (hpk42/pytest)

Wolfgang Schnerring issues-reply at bitbucket.org
Thu Mar 6 14:18:31 CET 2014


New issue 478: --pyargs does not understand namespace packages
https://bitbucket.org/hpk42/pytest/issue/478/pyargs-does-not-understand-namespace

Wolfgang Schnerring:

The pyargs resolution does not understand namespace packages when the different contributing packages are installed as eggs (which is the layout used by zc.buildout and also `pip install --egg`, see http://peak.telecommunity.com/DevCenter/setuptools#namespace-packages). It looks like this:

```
site-packages/
    zope.asdf.egg/
        zope/
            asdf/
                ...
    zope.qwer.egg/
        zope/
            qwer/
                ...
```

This is a well supported layout, which means `import zope.asdf` and `import zope.qwer` work just fine (the specification is something to the effect of, if there is more than one directory that claims to be package "zope", there is no guarantee which one you will actually get when you say `import zope`, but all subpackages will be accessible regardless).

But `py.test --pyargs zope.asdf` will work, while `py.test --pyargs zope.qwer` will say "file or package not found" (it might also be the other way around, so zope.qwer works, but zope.asdf doesn't).

This is because `_pytest.main.Session._tryconvertpyarg` does not actually rely on the Python import mechanism to do the resolution (I'm not sure why, I'm guessing it's to support collecting tests outside of packages?). Instead it splits the argument on dots and loads the **parts** from the import system, assuming their filesystem location is the one that matters -- which is incorrect. In the example, trying to resolve `zope.qwer`, it will first resolve `zope`, which results in a random matching entry, e.g `site-packages/zope.asdf/zope/__init__.py`. It then assumes that the rest of the name must exist below *this specific* directory, thus never finding `zope.qwer`.




More information about the pytest-commit mailing list