diff --git a/mitogen/master.py b/mitogen/master.py index 927ccaf11..b37fcaeb7 100644 --- a/mitogen/master.py +++ b/mitogen/master.py @@ -918,6 +918,12 @@ class ModuleFinder(object): related modules likely needed by a child context requesting the original module. """ + + # Fullnames of modules not to send as a related module + _related_modules_denylist = frozenset({ + '__main__', + }) + def __init__(self): #: Import machinery is expensive, keep :py:meth`:get_module_source` #: results around. @@ -1006,6 +1012,34 @@ def generate_parent_names(self, fullname): fullname, _, _ = str_rpartition(to_text(fullname), u'.') yield fullname + def _reject_related_module(self, requested_fullname, related_fullname): + def _log(reason): + return reason + LOG.debug( + '%r: Rejected related module %s of requested module %s, ' + 'reason: %s', + self, related_fullname, requested_fullname, reason, + ) + return reason + + try: related_module = sys.modules[related_fullname] + except KeyError: return _log('sys.modules entry absent') + + # Python 2.x "indirection entry" + if related_module is None: + return _log('sys.modules entry is None') + + if is_stdlib_name(related_fullname): + return _log('stdlib module') + + if 'six.moves' in related_fullname: + return _log('six.moves avoidence') + + if related_fullname in self._related_modules_denylist: + return _log('denylist') + + return False + def find_related_imports(self, fullname): """ Return a list of non-stdlib modules that are directly imported by @@ -1048,9 +1082,7 @@ def find_related_imports(self, fullname): set( mitogen.core.to_text(name) for name in maybe_names - if sys.modules.get(name) is not None - and not is_stdlib_name(name) - and u'six.moves' not in name # TODO: crap + if not self._reject_related_module(fullname, name) ) )) @@ -1213,7 +1245,7 @@ def _build_tuple(self, fullname): self._cache[fullname] = tup return tup - def _send_load_module(self, stream, fullname): + def _send_load_module(self, stream, fullname, reason): if fullname not in stream.protocol.sent_modules: tup = self._build_tuple(fullname) msg = mitogen.core.Message.pickled( @@ -1221,8 +1253,8 @@ def _send_load_module(self, stream, fullname): dst_id=stream.protocol.remote_id, handle=mitogen.core.LOAD_MODULE, ) - self._log.debug('sending %s (%.2f KiB) to %s', - fullname, len(msg.data) / 1024.0, stream.name) + self._log.debug('sending %s %s (%.2f KiB) to %s', + reason, fullname, len(msg.data) / 1024.0, stream.name) self._router._async_route(msg) stream.protocol.sent_modules.add(fullname) if tup[2] is not None: @@ -1253,8 +1285,8 @@ def _send_module_and_related(self, stream, fullname): # Parent hasn't been sent, so don't load submodule yet. continue - self._send_load_module(stream, name) - self._send_load_module(stream, fullname) + self._send_load_module(stream, name, 'related') + self._send_load_module(stream, fullname, 'requested') except Exception: LOG.debug('While importing %r', fullname, exc_info=True) self._send_module_load_failed(stream, fullname)