On Oct 02, 2010, at 10:36 AM, Georg Brandl wrote: >Am 02.10.2010 00:06, schrieb Barry Warsaw: > >> The reason is that the import.c logic that uses the struct filedescr >> tables built from _PyImport_DynLoadFiletab are just not smart enough >> to handle this case. All it knows about are suffix, and for >> backwards compatibility, we have dynload_shlib.c matching >> both .SOABI.so *and* bare .so. So when it's searching the >> directories for .cpython-32m.so files, it finds >> the ..cpython-32dmu.so first based on the bare .so match. > >I don't understand -- wouldn't "foo.sometag.so" (where sometag is not >SOABI) only be found a match for a suffix of ".so" if the module name >requested is "foo.sometag"? (And if not, isn't implementing that the >easiest solution?)
Yep, my analysis was faulty. Python's own import machinery does exactly the right thing. I think the problem is in distribute, which writes a _foo.py file that bootstraps into loading the wrong .so file. E.g. for an extension names _stupid, you end up with this _stupid.py in the egg: def __bootstrap__(): global __bootstrap__, __loader__, __file__ import sys, pkg_resources, imp __file__ = pkg_resources.resource_filename(__name__,'_stupid.cpython-32dmu.so') __loader__ = None; del __bootstrap__, __loader__ imp.load_dynamic(__name__,__file__) __bootstrap__() Python's built-in import finds _stupid.py, but this is hardcoded to the build-flags of the last Python used to install the package. If instead this looked like: def __bootstrap__(): global __bootstrap__, __loader__, __file__ import sys, pkg_resources, imp, sysconfig __file__ = pkg_resources.resource_filename(__name__,'_stupid.{soabi}.so'.format(soabi=sysconfig.get_config_var('SOABI'))) __loader__ = None; del __bootstrap__, __loader__ imp.load_dynamic(__name__,__file__) __bootstrap__() then everything works out just fine. If you install only the 'dmu' version and try to import it with the 'm' Python, you get an ImportError as expected (i.e. not a crash!). -Barry
signature.asc
Description: PGP signature
_______________________________________________ Python-Dev mailing list Python-Dev@python.org http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com