def pool_worker_main(item: WorkItemInput, output: multiprocessing.queues.Queue) -> None: try: # TODO figure out a more reliable way to suppress this. Redirect output? # Ignore ctrl-c in workers to reduce noisy tracebacks (the parent will kill us): signal.signal(signal.SIGINT, signal.SIG_IGN) if hasattr(os, 'nice'): # analysis should run at a low priority os.nice(10) set_debug(False) filename, options, deadline = item stats: Counter[str] = Counter() options.stats = stats _, module_name = extract_module_from_file(filename) try: module = load_by_qualname(module_name) except NotFound: return except ErrorDuringImport as e: orig, frame = e.args message = AnalysisMessage(MessageType.IMPORT_ERR, str(orig), frame.filename, frame.lineno, 0, '') output.put((filename, stats, [message])) debug(f'Not analyzing "{filename}" because import failed: {e}') return messages = analyze_any(module, options) output.put((filename, stats, messages)) except BaseException as e: raise CrosshairInternal( 'Worker failed while analyzing ' + filename) from e
def checked_load(qualname: str) -> Optional[types.FunctionType]: try: obj = load_by_qualname(qualname) if isinstance(obj, types.FunctionType): return obj else: raise Exception('Not a function') except Exception as exc: print(f'Unable to load "{qualname}": {exc}', file=sys.stderr) return None
def check(args: argparse.Namespace, options: AnalysisOptions, stdout: TextIO) -> int: any_messages = False for name in args.files: entity: object try: entity = load_file(name) if name.endswith('.py') else load_by_qualname(name) except ErrorDuringImport as e: stdout.write(str(short_describe_message(import_error_msg(e))) + '\n') any_messages = True continue debug('Check ', getattr(entity, '__name__', str(entity))) for message in analyze_any(entity, options): line = short_describe_message(message) if line is not None: stdout.write(line + '\n') debug('Traceback for output message:\n', message.traceback) any_messages = True return 2 if any_messages else 0
def check(args: argparse.Namespace, options: AnalysisOptions) -> int: any_errors = False for name in args.files: entity: object if name.endswith('.py'): _, name = extract_module_from_file(name) try: entity = importlib.import_module(name) except Exception as e: debug(f'Not analyzing "{name}" because import failed: {e}') continue else: entity = load_by_qualname(name) debug('Check ', getattr(entity, '__name__', str(entity))) for message in analyze_any(entity, options): line = short_describe_message(message) if line is not None: print(line) debug('Traceback for output message:\n', message.traceback) any_errors = True return 1 if any_errors else 0
def get_member(self): return load_by_qualname(self.qual_name)