From 86a3d9e72804e72e2fa659f95f368597dbba619c Mon Sep 17 00:00:00 2001 From: Stefan Behnel Date: Fri, 18 Jan 2013 14:58:28 +0100 Subject: [PATCH] implement relative import support for .pxd files in cythonize() --- Cython/Build/Dependencies.py | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/Cython/Build/Dependencies.py b/Cython/Build/Dependencies.py index a13d62c..b67a6aa 100644 --- a/Cython/Build/Dependencies.py +++ b/Cython/Build/Dependencies.py @@ -383,16 +383,29 @@ class DependencyTree(object): module = os.path.splitext(os.path.basename(filename))[0] return '.'.join(self.package(filename) + (module,)) + @cached_method def find_pxd(self, module, filename=None): - if module[0] == '.': + is_relative = module[0] == '.' + if is_relative and not filename: raise NotImplementedError("New relative imports.") if filename is not None: - relative = '.'.join(self.package(filename) + tuple(module.split('.'))) + module_path = module.split('.') + if is_relative: + module_path.pop(0) # just explicitly relative + package_path = list(self.package(filename)) + while module_path and not module_path[0]: + try: + package_path.pop() + except IndexError: + return None # FIXME: error? + module_path.pop(0) + relative = '.'.join(package_path + module_path) pxd = self.context.find_pxd_file(relative, None) if pxd: return pxd + if is_relative: + return None # FIXME: error? return self.context.find_pxd_file(module, None) - find_pxd = cached_method(find_pxd) @cached_method def cimported_files(self, filename): -- 2.7.4