diff --git a/pyximport/pyximport.py b/pyximport/pyximport.py index 264170bb57d26138ed3b010ff8008f24bc28f4d8..95bbd88821fcf2efb7fb63e2cdadaf063377fcd0 100644 --- a/pyximport/pyximport.py +++ b/pyximport/pyximport.py @@ -62,6 +62,18 @@ PYXBLD_EXT = ".pyxbld" DEBUG_IMPORT = False +def _print(message, args): + if args: + message = message % args + print(message) + +def _debug(message, *args): + if DEBUG_IMPORT: + _print(message, args) + +def _info(message, *args): + _print(message, args) + # Performance problem: for every PYX file that is imported, we will # invoke the whole distutils infrastructure even if the module is # already built. It might be more efficient to only do it when the @@ -142,7 +154,7 @@ def handle_dependencies(pyxfilename): for file in files: from distutils.dep_util import newer if newer(file, pyxfilename): - print("Rebuilding because of ", file) + _debug("Rebuilding %s because of %s", pyxfilename, file) filetime = os.path.getmtime(file) os.utime(pyxfilename, (filetime, filetime)) if testing: @@ -174,13 +186,17 @@ def build_module(name, pyxfilename, pyxbuild_dir=None): try: os.remove(path) except IOError: - print("Couldn't remove ", path) + _info("Couldn't remove %s", path) return so_path -def load_module(name, pyxfilename, pyxbuild_dir=None): +def load_module(name, pyxfilename, pyxbuild_dir=None, is_package=False): try: - so_path = build_module(name, pyxfilename, pyxbuild_dir) + if is_package: + module_name = name + '.__init__' + else: + module_name = name + so_path = build_module(module_name, pyxfilename, pyxbuild_dir) mod = imp.load_dynamic(name, so_path) assert mod.__file__ == so_path, (mod.__file__, so_path) except Exception: @@ -190,8 +206,9 @@ def load_module(name, pyxfilename, pyxbuild_dir=None): assert mod.__file__ in (pyxfilename, pyxfilename+'c', pyxfilename+'o'), (mod.__file__, pyxfilename) else: import traceback - raise ImportError("Building module failed: %s" % - traceback.format_exception_only(*sys.exc_info()[:2])),None,sys.exc_info()[2] + raise ImportError("Building module %s failed: %s" % + (name, + traceback.format_exception_only(*sys.exc_info()[:2]))), None, sys.exc_info()[2] return mod @@ -210,6 +227,12 @@ class PyxImporter(object): try: fp, pathname, (ext,mode,ty) = imp.find_module(fullname,package_path) if fp: fp.close() # Python should offer a Default-Loader to avoid this double find/open! + if pathname and ty == imp.PKG_DIRECTORY: + pkg_file = os.path.join(pathname, '__init__'+self.extension) + if os.path.isfile(pkg_file): + return PyxLoader(fullname, pathname, + init_path=pkg_file, + pyxbuild_dir=self.pyxbuild_dir) if pathname and pathname.endswith(self.extension): return PyxLoader(fullname, pathname, pyxbuild_dir=self.pyxbuild_dir) @@ -224,12 +247,12 @@ class PyxImporter(object): # .so/.pyd's on PATH should not be remote from .pyx's # think no need to implement PyxArgs.importer_search_remote here? - + except ImportError: pass # searching sys.path ... - + #if DEBUG_IMPORT: print "SEARCHING", fullname, package_path if '.' in fullname: # only when package_path anyway? mod_parts = fullname.split('.') @@ -257,6 +280,7 @@ class PyxImporter(object): pyxbuild_dir=self.pyxbuild_dir) # not found, normal package, not a .pyx file, none of our business + _debug("%s not found" % fullname) return None class PyImporter(PyxImporter): @@ -277,8 +301,7 @@ class PyImporter(PyxImporter): if fullname in self.blocked_modules: # prevent infinite recursion return None - if DEBUG_IMPORT: - print("trying import of module '%s'" % fullname) + _debug("trying import of module '%s'", fullname) if fullname in self.uncompilable_modules: path, last_modified = self.uncompilable_modules[fullname] try: @@ -297,11 +320,12 @@ class PyImporter(PyxImporter): try: if importer.init_path: path = importer.init_path + real_name = fullname + '.__init__' else: path = importer.path - if DEBUG_IMPORT: - print("importer found path %s" % path) - build_module(fullname, path, + real_name = fullname + _debug("importer found path %s for module %s", path, real_name) + build_module(real_name, path, pyxbuild_dir=self.pyxbuild_dir) except Exception, e: if DEBUG_IMPORT: @@ -320,6 +344,7 @@ class PyImporter(PyxImporter): class PyxLoader(object): def __init__(self, fullname, path, init_path=None, pyxbuild_dir=None): + _debug("PyxLoader created for loading %s from %s (init path: %s)", fullname, path, init_path) self.fullname = fullname self.path, self.init_path = path, init_path self.pyxbuild_dir = pyxbuild_dir @@ -332,7 +357,7 @@ class PyxLoader(object): # package #print "PACKAGE", fullname module = load_module(fullname, self.init_path, - self.pyxbuild_dir) + self.pyxbuild_dir, is_package=True) module.__path__ = [self.path] else: #print "MODULE", fullname