def execNode(self, pCommand):
        """
        | Emulate the execution of a command on a worker node.
        | 2 possible execution mode: with a subprocess or direct
        | - Calls the "commandwatcher.py" script used by the worker \
            process to keep a similar behaviour
        |   Command output and error messages are left in stdout/stderr to \
            give the user a proper feedback of its command
        | - Create CommandWatcherObject in current exec

        :param pCommand: dict containing the command description and arguments
        :raise: GraphExecInterrupt when a keyboard interrupt is raised
        """
        print ""
        #from octopus.commandwatcher import commandwatcher

        commandId = pCommand["execid"]
        # taskId = pCommand["taskid"]
        runner = pCommand["runner"]
        runnerPackages = pCommand.get("runnerPackages", "undefined")
        validationExpression = pCommand["validationExpression"]

        print(pCommand)
        #
        # SECURE WAY: start a subprocess
        #
        #####
        # CommandWatcher call, arguments expected are:
        # - python executable
        # - flag "u" to load commands from a file
        # - file to load
        # - a communication port to contact a worker if execution is done in remote contact (executed via puli's worker)
        # - a command id
        # - a runner class
        # - an optionnal validation expression

        # from octopus.commandwatcher import commandwatcher
        # scriptFile = commandwatcher.__file__
        # pythonExecutable = sys.executable
        # args = [
        #     pythonExecutable,
        #     "-u",
        #     scriptFile,
        #     "",
        #     "0",
        #     str(commandId),
        #     runner,
        #     validationExpression,
        # ]
        # args.extend(('%s=%s' % (str(name), str(value)) for (name, value) in pCommand["arguments"].items()))
        # #### normalize environment~-> TOCHECK peut etre a supprimer justement pour garder l'env en execution locale (attention au
        # #### call subprocess qui ajoute envN
        # envN = {}
        # envN["PYTHONPATH"] = "/s/apps/lin/vfx_test_apps/OpenRenderManagement/Puli/src"
        # for key in pCommand["environment"]:
        #     envN[str(key)] = str(pCommand["environment"][key])

        # # print("Starting subprocess, log: %r, args: %r" % (logFile, args) )
        # try:
        #     proc = subprocess.Popen(args, bufsize=-1, stdin=None, stdout=None,
        #                stderr=None, close_fds=True,
        #                env=envN)
        #     proc.wait()
        # except Exception,e:
        #     print("Impossible to start subprocess: %r" % e)
        #     raise e
        # except KeyboardInterrupt:
        #     sys.exit(0)
        # print ""

        #
        # DIRECT CALL: create CommandWatcher object
        #
        from octopus.commandwatcher.commandwatcher import CommandWatcher

        try:
            result = CommandWatcher("",
                                    "0",
                                    commandId,
                                    runner,
                                    runnerPackages,
                                    validationExpression,
                                    pCommand["arguments"])
            return result.finalState

        except __HOLE__:
            print("\n")
            print("Exit event caught: exiting CommandWatcher...\n")
            # sys.exit(0)
            raise GraphExecInterrupt
dataset/ETHPy150Open mikrosimage/OpenRenderManagement/src/puliclient/__init__.py/Graph.execNode