<div dir="ltr">More data:<div><br></div><div>This works fine with python 3<br><div><br></div><div><font face="courier new, monospace">PYTHONPATH=whl_dist python3 -c 'import twitter.common.python'</font><br></div></div>
<div><font face="courier new, monospace"><br></font></div><div style><font face="arial, helvetica, sans-serif">but pkg_resource still barfs</font></div><div style><font face="arial, helvetica, sans-serif"><br></font></div>
<div style><div><font face="courier new, monospace">PYTHONPATH=whl_dist python3 -c 'import pkg_resources'</font></div><div><font face="courier new, monospace">Traceback (most recent call last):</font></div><div><font face="courier new, monospace">  File "<string>", line 1, in <module></font></div>
<div><font face="courier new, monospace">  File "<frozen importlib._bootstrap>", line 1565, in _find_and_load</font></div><div><font face="courier new, monospace">  File "<frozen importlib._bootstrap>", line 1532, in _find_and_load_unlocked</font></div>
<div><font face="courier new, monospace">  File "/Users/wickman/Python/CPython-3.3.3/lib/python3.3/site-packages/setuptools-2.0.2-py3.3.egg/pkg_resources.py", line 2725, in <module></font></div><div><font face="courier new, monospace">  File "/Users/wickman/Python/CPython-3.3.3/lib/python3.3/site-packages/setuptools-2.0.2-py3.3.egg/pkg_resources.py", line 681, in subscribe</font></div>
<div><font face="courier new, monospace">  File "/Users/wickman/Python/CPython-3.3.3/lib/python3.3/site-packages/setuptools-2.0.2-py3.3.egg/pkg_resources.py", line 2725, in <lambda></font></div><div><font face="courier new, monospace">  File "/Users/wickman/Python/CPython-3.3.3/lib/python3.3/site-packages/setuptools-2.0.2-py3.3.egg/pkg_resources.py", line 2259, in activate</font></div>
<div><font face="courier new, monospace">  File "/Users/wickman/Python/CPython-3.3.3/lib/python3.3/site-packages/setuptools-2.0.2-py3.3.egg/pkg_resources.py", line 1843, in declare_namespace</font></div><div><font face="courier new, monospace">KeyError: 'twitter'</font></div>
<div style="font-family:arial,helvetica,sans-serif"><br></div><div style="font-family:arial,helvetica,sans-serif">I did find a related wheel issue:</div><div style="font-family:arial,helvetica,sans-serif"><a href="https://bitbucket.org/pypa/wheel/issue/46/delete-namespace-__init__py-based-on">https://bitbucket.org/pypa/wheel/issue/46/delete-namespace-__init__py-based-on</a><br>
</div><div style="font-family:arial,helvetica,sans-serif"><br></div><div style="font-family:arial,helvetica,sans-serif">But this seems to describe the opposite behavior, i.e. that the installer should be deleting __init__.pys instead of creating them.</div>
<div style="font-family:arial,helvetica,sans-serif"><br></div><div style="font-family:arial,helvetica,sans-serif">In the meantime, my two options are building an installer that populates __init__.pys, or instead just calling site.addsitedir each time I call dist.activate().  I'm guessing the latter is preferable as it does not unnecessarily introduce a pkg_resources dependency.</div>
<div style="font-family:arial,helvetica,sans-serif"><br></div><div style="font-family:arial,helvetica,sans-serif">~brian</div></div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Fri, Mar 7, 2014 at 8:15 PM, Brian Wickman <span dir="ltr"><<a href="mailto:wickman@gmail.com" target="_blank">wickman@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Not sure if this belongs on distutils-sig or import-sig, but I'm experiencing slightly odd behavior with wheels and namespace packages.<div>
<br></div><div>Fetch a namespace package source distribution, e.g. twitter.common.python, and build two copies of it, one with bdist_egg and one with bdist_wheel.</div>
<div><br></div><div>This leaves me with:</div><div><font face="courier new, monospace">twitter.common.python-0.3.1-py2.6.egg</font></div><div><font face="courier new, monospace">twitter.common.python-0.3.1-py26-none-any.whl</font></div>

<div><br></div><div>Explode them into the following directories (respectively):</div><div><font face="courier new, monospace">egg_dist</font></div><div><font face="courier new, monospace">whl_dist </font></div>
<div><br></div><div>Then attempt:</div><div><br></div><div><font face="courier new, monospace">PYTHONPATH=egg_dist python -c 'import twitter.common.python'</font></div><div><br></div>
<div>(works)</div><div><br></div><div><div><font face="courier new, monospace">PYTHONPATH=whl_dist python -c 'import twitter.common.python'</font></div><div><br></div><div>(drumroll)</div><div>
<br></div><div><div><font face="courier new, monospace">Traceback (most recent call last):</font></div><div><font face="courier new, monospace">  File "<string>", line 1, in <module></font></div>
<div><font face="courier new, monospace">ImportError: No module named twitter.common.python</font></div><div><br></div><div>This is slightly unexpected.  Absent from the .whl distribution are the <font face="courier new, monospace">__init__.py</font>s with the proper declare_namespace declarations.  Even more bizarrely:</div>

<div><br></div><div><div><font face="courier new, monospace">PYTHONPATH=whl_dist python -c 'import pkg_resources'</font></div><div><font face="courier new, monospace">Traceback (most recent call last):</font></div>

<div><font face="courier new, monospace">  File "<string>", line 1, in <module></font></div><div><font face="courier new, monospace">  File "/Users/wickman/Python/CPython-2.6.9/lib/python2.6/site-packages/pkg_resources.py", line 2736, in <module></font></div>

<div><font face="courier new, monospace">    add_activation_listener(lambda dist: dist.activate())</font></div><div><font face="courier new, monospace">  File "/Users/wickman/Python/CPython-2.6.9/lib/python2.6/site-packages/pkg_resources.py", line 698, in subscribe</font></div>

<div><font face="courier new, monospace">    callback(dist)</font></div><div><font face="courier new, monospace">  File "/Users/wickman/Python/CPython-2.6.9/lib/python2.6/site-packages/pkg_resources.py", line 2736, in <lambda></font></div>

<div><font face="courier new, monospace">    add_activation_listener(lambda dist: dist.activate())</font></div><div><font face="courier new, monospace">  File "/Users/wickman/Python/CPython-2.6.9/lib/python2.6/site-packages/pkg_resources.py", line 2274, in activate</font></div>

<div><font face="courier new, monospace">    list(map(declare_namespace, self._get_metadata('namespace_packages.txt')))</font></div><div><font face="courier new, monospace">  File "/Users/wickman/Python/CPython-2.6.9/lib/python2.6/site-packages/pkg_resources.py", line 1870, in declare_namespace</font></div>

<div><font face="courier new, monospace">    path = sys.modules[parent].__path__</font></div><div><font face="courier new, monospace">KeyError: 'twitter'</font></div><div><br></div><div>So even pkg_resources is surprised as well.  If I do the following:</div>

<div><br></div><div><font face="courier new, monospace">PYTHONPATH=whl_dist python -c 'import site; site.addsitedir("whl_dist"); import twitter.common.python'</font><br></div><div><font face="courier new, monospace"><br>

</font></div><div><font face="arial, helvetica, sans-serif">then it works, since the </font><font face="courier new, monospace">twitter.common.python-0.3.1-py2.6-nspkg.pth</font><font face="arial, helvetica, sans-serif"> gets processed properly and module.__path__s populated accordingly.  I would expect pkg_resources to handle this fine but apparently it doesn't.</font></div>

<div><font face="arial, helvetica, sans-serif"><br></font></div><div><font face="arial, helvetica, sans-serif">Any ideas?  Bug in pkg_resources, wheel or PEBKAC?</font></div><div><font face="arial, helvetica, sans-serif"><br>

</font></div><div><font face="arial, helvetica, sans-serif">Thanks!</font></div><span class="HOEnZb"><font color="#888888"><div><font face="arial, helvetica, sans-serif">~brian</font></div><div><font face="arial, helvetica, sans-serif"><br>
</font></div>
</font></span></div></div></div></div>
</blockquote></div><br></div>