Example #1
0
    def cmd_shell(self):
        # readline is used transparently by code.InteractiveConsole()
        import readline  # noqa: F401

        vars = {
            'concurrency_groups': self.config.concurrency_groups,
            'config': self.config,
            'datetime': datetime,
            'db': self.db,
            'dsari': dsari,
            'jobs': self.config.jobs,
        }
        banner = 'Additional variables available:\n'
        for (k, v) in vars.items():
            v = vars[k]
            if type(v) == dict:
                r = 'Dictionary ({} items)'.format(len(v))
            elif type(v) == list:
                r = 'List ({} items)'.format(len(v))
            else:
                r = repr(v)
            banner += '    {}: {}\n'.format(k, r)
        banner += '\n'

        sh = None
        try:
            from IPython.terminal.embed import InteractiveShellEmbed
            sh = InteractiveShellEmbed(user_ns=vars, banner2=banner)
            sh.excepthook = sys.__excepthook__
        except ImportError:
            print('ipython not available. Using normal python shell.')

        if sh:
            sh()
        else:
            import code

            class DsariConsole(code.InteractiveConsole):
                pass

            console_vars = vars.copy().update({
                '__name__': '__console__',
                '__doc__': None,
            })
            print(banner, end='')
            DsariConsole(locals=console_vars).interact()