def run(src, grammar=NODEBOX, format=None, outputfile=None, iterations=1, buff=None, window=True, title=None, fullscreen=None, close_window=False, server=False, port=7777, show_vars=False, vars=None, namespace=None, run_shell=False, args=[], verbose=False, background_thread=True): """ Create and run a bot, the arguments all correspond to sanitized commandline options. :param background_thread: If True then use a background thread. Other args are split into create_args and run_args See create_bot for details on create_args run_args are passed to bot.run - see Nodebot.run or Drawbot.run Background thread: readline in python is blocking, running the app in a background thread opens up the main thread for IO on stdin/stdout, which can be used for communication with shoebot when livecoding is enabled. See shoebot.io for implementation of the shell, and the gedit plugin for an example of using livecoding. """ # Munge shoebogt sys.argv sys.argv = [ sys.argv[0] ] + args # Remove shoebot parameters so sbot can be used in place of the python interpreter (e.g. for sphinx). # arguments for create_bot create_args = [ src, grammar, format, outputfile, iterations, buff, window, title, fullscreen, server, port, show_vars ] create_kwargs = dict(vars=vars, namespace=namespace) run_args = [src] run_kwargs = dict( iterations=iterations, frame_limiter=window, verbose=verbose, # run forever except 1. windowed mode is off 2. if --close-window was specified and # 3. if an output file was indicated run_forever=window and not (close_window or bool(outputfile)), ) # Run shoebot in a background thread so we can run a cmdline shell in the current thread if background_thread: sbot_thread = ShoebotThread(create_args=create_args, create_kwargs=create_kwargs, run_args=run_args, run_kwargs=run_kwargs, send_sigint=run_shell) sbot_thread.start() sbot = sbot_thread.sbot else: print('background thread disabled') # This is a debug option, things should always work using the # background thread (crosses fingers) if run_shell: # python readline is blocking, so ui must run in a seperate # thread raise ValueError( 'UI Must run in a separate thread to shell and shell needs main thread' ) sbot_thread = None sbot = create_bot(*create_args, **create_kwargs) sbot.run(*run_args, **run_kwargs) if run_shell: import shoebot.sbio.shell shell = shoebot.sbio.shell.ShoebotCmd(sbot, trusted=True) try: shell.cmdloop() except KeyboardInterrupt as e: publish_event(QUIT_EVENT) # Handle Ctrl-C # KeyboardInterrupt is generated by os.kill from the other thread if verbose: raise else: return elif background_thread: try: while sbot_thread.is_alive(): sleep(1) except KeyboardInterrupt: publish_event(QUIT_EVENT) if all((background_thread, sbot_thread)): sbot_thread.join() return sbot
def run(src, grammar=NODEBOX, format=None, outputfile=None, iterations=1, buff=None, window=True, title=None, fullscreen=None, close_window=False, server=False, port=7777, show_vars=False, vars=None, namespace=None, run_shell=False, args=[], verbose=False, background_thread=True): """ Create and run a bot, the arguments all correspond to sanitized commandline options. :param background_thread: If True then use a background thread. Other args are split into create_args and run_args See create_bot for details on create_args run_args are passed to bot.run - see Nodebot.run or Drawbot.run Background thread: readline in python is blocking, running the app in a background thread opens up the main thread for IO on stdin/stdout, which can be used for communication with shoebot when livecoding is enabled. See shoebot.io for implementation of the shell, and the gedit plugin for an example of using livecoding. """ # Munge shoebogt sys.argv sys.argv = [sys.argv[ 0]] + args # Remove shoebot parameters so sbot can be used in place of the python interpreter (e.g. for sphinx). # arguments for create_bot create_args = [src, grammar, format, outputfile, iterations, buff, window, title, fullscreen, server, port, show_vars] create_kwargs = dict(vars=vars, namespace=namespace) run_args = [src] run_kwargs = dict( iterations=iterations, frame_limiter=window, verbose=verbose, # run forever except 1. windowed mode is off 2. if --close-window was specified and # 3. if an output file was indicated run_forever=window and not (close_window or bool(outputfile)), ) # Run shoebot in a background thread so we can run a cmdline shell in the current thread if background_thread: sbot_thread = ShoebotThread( create_args=create_args, create_kwargs=create_kwargs, run_args=run_args, run_kwargs=run_kwargs, send_sigint=run_shell ) sbot_thread.start() sbot = sbot_thread.sbot else: print('background thread disabled') # This is a debug option, things should always work using the # background thread (crosses fingers) if run_shell: # python readline is blocking, so ui must run in a seperate # thread raise ValueError('UI Must run in a separate thread to shell and shell needs main thread') sbot_thread = None sbot = create_bot(*create_args, **create_kwargs) sbot.run(*run_args, **run_kwargs) if run_shell: import shoebot.sbio.shell shell = shoebot.sbio.shell.ShoebotCmd(sbot, trusted=True) try: shell.cmdloop() except KeyboardInterrupt as e: publish_event(QUIT_EVENT) # Handle Ctrl-C # KeyboardInterrupt is generated by os.kill from the other thread if verbose: raise else: return elif background_thread: try: while sbot_thread.is_alive(): sleep(1) except KeyboardInterrupt: publish_event(QUIT_EVENT) if all((background_thread, sbot_thread)): sbot_thread.join() return sbot