def run_pipeline(source, options, full_module_name=None, context=None): import Pipeline source_ext = os.path.splitext(source)[1] options.configure_language_defaults(source_ext[1:]) # py/pyx if context is None: context = options.create_context() # Set up source object cwd = os.getcwd() abs_path = os.path.abspath(source) full_module_name = full_module_name or context.extract_module_name( source, options) if options.relative_path_in_code_position_comments: rel_path = full_module_name.replace('.', os.sep) + source_ext if not abs_path.endswith(rel_path): rel_path = source # safety measure to prevent printing incorrect paths else: rel_path = abs_path source_desc = FileSourceDescriptor(abs_path, rel_path) source = CompilationSource(source_desc, full_module_name, cwd) # Set up result object result = create_default_resultobj(source, options) if options.annotate is None: # By default, decide based on whether an html file already exists. html_filename = os.path.splitext(result.c_file)[0] + ".html" if os.path.exists(html_filename): line = codecs.open(html_filename, "r", encoding="UTF-8").readline() if line.startswith(u'<!-- Generated by Cython'): options.annotate = True # Get pipeline if source_ext.lower() == '.py' or not source_ext: pipeline = Pipeline.create_py_pipeline(context, options, result) else: pipeline = Pipeline.create_pyx_pipeline(context, options, result) context.setup_errors(options, result) err, enddata = Pipeline.run_pipeline(pipeline, source) context.teardown_errors(err, options, result) return result
def run_pipeline(source, options, full_module_name = None): # Set up context context = Context(options.include_path, options.pragma_overrides) # Set up source object cwd = os.getcwd() source_desc = FileSourceDescriptor(os.path.join(cwd, source)) full_module_name = full_module_name or context.extract_module_name(source, options) source = CompilationSource(source_desc, full_module_name, cwd) # Set up result object result = create_default_resultobj(source, options) # Get pipeline if source_desc.filename.endswith(".py"): pipeline = context.create_py_pipeline(options, result) else: pipeline = context.create_pyx_pipeline(options, result) context.setup_errors(options) err, enddata = context.run_pipeline(pipeline, source) context.teardown_errors(err, options, result) return result
def find_module(self, module_name, relative_to=None, pos=None, need_pxd=1, check_module_name=True): # Finds and returns the module scope corresponding to # the given relative or absolute module name. If this # is the first time the module has been requested, finds # the corresponding .pxd file and process it. # If relative_to is not None, it must be a module scope, # and the module will first be searched for relative to # that module, provided its name is not a dotted name. debug_find_module = 0 if debug_find_module: print( "Context.find_module: module_name = %s, relative_to = %s, pos = %s, need_pxd = %s" % (module_name, relative_to, pos, need_pxd)) scope = None pxd_pathname = None if check_module_name and not module_name_pattern.match(module_name): if pos is None: pos = (module_name, 0, 0) raise CompileError(pos, "'%s' is not a valid module name" % module_name) if "." not in module_name and relative_to: if debug_find_module: print("...trying relative import") scope = relative_to.lookup_submodule(module_name) if not scope: qualified_name = relative_to.qualify_name(module_name) pxd_pathname = self.find_pxd_file(qualified_name, pos) if pxd_pathname: scope = relative_to.find_submodule(module_name) if not scope: if debug_find_module: print("...trying absolute import") scope = self for name in module_name.split("."): scope = scope.find_submodule(name) if debug_find_module: print("...scope =", scope) if not scope.pxd_file_loaded: if debug_find_module: print("...pxd not loaded") scope.pxd_file_loaded = 1 if not pxd_pathname: if debug_find_module: print("...looking for pxd file") pxd_pathname = self.find_pxd_file(module_name, pos) if debug_find_module: print("......found ", pxd_pathname) if not pxd_pathname and need_pxd: package_pathname = self.search_include_directories( module_name, ".py", pos) if package_pathname and package_pathname.endswith( '__init__.py'): pass else: error(pos, "'%s.pxd' not found" % module_name) if pxd_pathname: try: if debug_find_module: print("Context.find_module: Parsing %s" % pxd_pathname) rel_path = module_name.replace( '.', os.sep) + os.path.splitext(pxd_pathname)[1] if not pxd_pathname.endswith(rel_path): rel_path = pxd_pathname # safety measure to prevent printing incorrect paths source_desc = FileSourceDescriptor(pxd_pathname, rel_path) err, result = self.process_pxd(source_desc, scope, module_name) if err: raise err (pxd_codenodes, pxd_scope) = result self.pxds[module_name] = (pxd_codenodes, pxd_scope) except CompileError: pass return scope