def buildModuleTree(filename, package, is_top, is_main): module, source_ref, source_filename = decideModuleTree( filename=filename, package=package, is_top=is_top, is_main=is_main, is_shlib=False, ) if is_top: ModuleRegistry.addRootModule(module) OutputDirectories.setMainModule(module) # Detect to be frozen modules if any, so we can consider to not recurse # to them. if Options.isStandaloneMode(): detectEarlyImports() # If there is source code associated (not the case for namespace packages of # Python3.3 or higher, then read it. if source_filename is not None: source_code = readSourceCodeFromFilename( module_name=module.getFullName(), source_filename=source_filename ) if is_main: checkPythonVersionFromCode(source_code) # Read source code. createModuleTree( module=module, source_ref=source_ref, source_code=source_code, is_main=is_main, ) # Main modules do not get added to the import cache, but plugins get to see it. if module.isMainModule(): Plugins.onModuleDiscovered(module) else: addImportedModule(imported_module=module) return module
def buildModule( module_name, module_filename, source_code, is_top, is_main, is_extension, is_fake, hide_syntax_error, ): # Many details to deal with, pylint: disable=too-many-branches,too-many-locals ( main_added, is_package, is_namespace, source_ref, source_filename, ) = Importing.decideModuleSourceRef( filename=module_filename, module_name=module_name, is_main=is_main, is_fake=is_fake, logger=general, ) if Options.hasPythonFlagPackageMode(): if is_top and Options.shallMakeModule(): optimization_logger.warning( "Python flag -m (package_mode) has no effect in module mode, it's only for executables." ) elif is_main and not main_added: optimization_logger.warning( "Python flag -m (package_mode) only works on packages with '__main__.py'." ) # Read source code if necessary. Might give a SyntaxError due to not being proper # encoded source. if source_filename is not None and not is_namespace and not is_extension: try: # For fake modules, source is provided directly. if source_code is None: source_code = readSourceCodeFromFilename( module_name=module_name, source_filename=source_filename) except SyntaxError as e: # Avoid hiding our own syntax errors. if not hasattr(e, "generated_by_nuitka"): raise # Do not hide SyntaxError in main module. if not hide_syntax_error: raise module = _makeModuleBodyFromSyntaxError( exc=e, module_name=module_name, module_filename=module_filename) return module, True try: ast_tree = parseSourceCodeToAst( source_code=source_code, module_name=module_name, filename=source_filename, line_offset=0, ) except (SyntaxError, IndentationError) as e: # Do not hide SyntaxError if asked not to. if not hide_syntax_error: raise module = _makeModuleBodyFromSyntaxError( exc=e, module_name=module_name, module_filename=module_filename) return module, True except CodeTooComplexCode: # Do not hide CodeTooComplexCode in main module. if is_main: raise module = _makeModuleBodyTooComplex( module_name=module_name, module_filename=module_filename, source_code=source_code, is_package=is_package, ) return module, False else: ast_tree = None source_code = None module = _createModule( module_name=module_name, source_code=source_code, source_ref=source_ref, is_top=is_top, is_main=is_main, is_extension=is_extension, is_namespace=is_namespace, is_package=is_package, main_added=main_added, ) if is_top: ModuleRegistry.addRootModule(module) OutputDirectories.setMainModule(module) if module.isCompiledPythonModule() and source_code is not None: createModuleTree( module=module, source_ref=source_ref, ast_tree=ast_tree, is_main=is_main, ) return module, True