Пример #1
0
 def store(self):
     """Create an pack file with define environment
     """
     file_init = self.pack_system()
     file_init = file_init+".py"
     a_file = os.path.join(BaseEnv.base_pack(), file_init)
     try:
         with open(a_file, "w") as fh:
             for x in os.environ:
                 if x in BaseEnv.LIST_OF_KEY:
                     fh.write("set_path(%r,%r)\n" % (x, os.environ.get(x)))
     except Exception as e:
         raise Exception("Cannot store file: %s" % e)
Пример #2
0
    def execute(self, argv, fromPython=True):
        """This module is mainly to be used from shell in progress

            :param argv: a list of envi command
            :param fromPython: default True.
                the result of the function is in os.environ
            :returns bool: True if success
        """

        import subprocess
        # argument to remove
        opt = dict()
        opt["List"] = ["-L", False]
        opt["Reset"] = ["-Reset", False]  # no undo implemented
        opt["Info"] = ["-h", False]
        opt["Deamon"] = ['-Deamon', False]
        opt['Print'] = ["-Print", False]
        opt['Debug'] = ["-Debug", False]
        opt['Store'] = ["-Store", False]
        opt['DictOnly'] = ["-Dodict", False]
        opt['Clean'] = ["-Clean", False]
        opt['ExistOnly'] = ["-ExistOnly", False]

        cmdLines = " ".join(argv[1:]).split("--")

        if len(cmdLines) > 2:
            sys.stderr.write("Envi.execute: don't support multiple launch\n")
            return False
        cmdLines = [x for x in cmdLines if x != '']  # remove the blank
        if len(cmdLines) == 0:
            sys.stderr.write("Envi.execute: no arguments\n")
            return False
        cleanArg = list()

        envCmd = cmdLines[0]
        for i in opt:
            tempLine = envCmd.replace(opt[i][0], "")
            if tempLine != envCmd:
                opt[i] = [opt[i][0], not opt[i][1]]  # toggle the opt
                envCmd = tempLine

            #  return False
        if opt["Debug"][1] is True:
            self.set_debug(True)
            #  self._printall = True
        else:
            self.set_debug(False)
            #  self._printall = False

        if opt["Print"][1] is True:
            for x in os.environ:
                sys.stderr.write(x + ":\n")
                for y in os.environ[x].split(os.pathsep):
                    sys.stderr.write("\t" + y + "\n")
                #  sys.stdout.write("")
            return True

        if fromPython is False:
            if opt["Clean"][1] is True or opt["ExistOnly"][1] is True:
                self.main_cleanup(clean_double=opt["Clean"][1],
                                  exist_only=opt["ExistOnly"][1])
                return True

        if opt["Store"][1] is True:
            # build a pack file to store initial state
            self.store()
            return True

        if opt["Info"][1] is True:
            import dskenv
            c = BaseEnv.base_config()
            p = BaseEnv.base_pack()
            sys.stderr.write("config in: {}\npacks in: {}\n".format(c, p))
            if 'dev' in dskenv.__file__:
                sys.stderr.write("envi: dev dskenv\n")
            else:
                sys.stderr.write("envi: released code\n")
            sys.stderr.write("envi: released code\n")
            helplist = self.get_help()
            sys.stderr.write("\n".join(helplist))
            return True

        app = ""
        logfile = ""
        writefile = ""
        # search if app and logfile
        envArgs = envCmd.split(",")  # split per config
        paternapp = re.compile(r'-a\s*[\w\d\.\%s-]*' % os.sep)
        paternlog = re.compile(r'-l\s*[\w\d\.\%s-]*' % os.sep)
        paterncache = re.compile(r'-w\s*[\w\d\.\%s-]*' % os.sep)

        for envarg in envArgs:
            # app
            m = paternapp.search(envarg)
            if m:
                stringfound = m.group()
                envarg = envarg.replace(stringfound, "")
                app = stringfound.replace("-a", "")
                app = app.strip()

            # log
            aclean = envarg.strip()
            m = paternlog.search(aclean)
            if m:
                stringfound = m.group()
                envarg = envarg.replace(stringfound, "")
                logfile = stringfound.replace("-l", "")
                logfile = logfile.strip()

            # write
            aclean = envarg.strip()
            m = paterncache.search(aclean)

            if m:
                stringfound = m.group()
                envarg = envarg.replace(stringfound, "")
                writefile = stringfound.replace("-w", "")
                writefile = writefile.strip()

            aclean = envarg.strip()
            if aclean != "":
                cleanArg.append(aclean)

        if opt["List"][1] is True:
            import dskenv
            import getpass
            # if self.info_from_environment():
            #    for obj in self.get_commands():
            if writefile != "":
                is_d = False
                for x in cleanArg:
                    #  sys.stderr.write("---> %r\n" % x)
                    if '-d' in x:
                        #  sys.stderr.write("---> hellp\n")
                        is_d = True
                        break

                try:
                    f = open(writefile, "w")
                except:
                    traceback.print_exc()
                    return False

                #  for obj in BaseEnv.pack_history(
                # os.environ.get('DSKENVPATH')):
                for obj in BaseEnv.command_history():
                    if is_d is False:
                        # sys.stderr.write("---> %s\n" % obj)
                        """FOR LATER IF NEEDED"""
                        # paternd = re.compile("-D\s*[\w\d\.\-]*")
                        # m = paternd.search(obj)
                        # sys.stderr.write("-- %s" % m)
                        # if m:
                        #    obj = obj.replace(m.group(),"")
                        #    obj = obj.strip()
                        #  sys.stderr.write("envi "+ obj + ";\n")
                        f.write("envi " + obj + ";\n")
                    else:
                        #  sys.stderr.write("--------> %s\n" % obj)
                        f.write("envi " + obj + " -D %s;\n" %
                                (getpass.getuser()))

            else:
                for obj in BaseEnv.command_history():
                    sys.stderr.write("envi " + obj + ";\n")

                c = BaseEnv.base_config()
                p = BaseEnv.base_pack()
                sys.stderr.write("#config in {}\n#packs in {}\n".format(c, p))
                if 'dev' in dskenv.__file__:
                    sys.stderr.write("#envi code dev\n")
                else:
                    sys.stderr.write("#envi code released\n")

            return True

        if writefile != "" and len(cleanArg) == 0 and app == "":
            res = self.dump_os_as_shell(writefile)
            if res is True:
                sys.stderr.write("DONE\n")
            else:
                sys.stderr.write("ERROR: couldn't create %s\n" % writefile)
            return True

        if logfile != "" and os.path.exists(os.path.dirname(logfile)):
            self.startlog(logfile)
            self.setPath("ENVI_LOG", logfile)
        else:
            self.unsetPath("ENVI_LOG")

        # take a snapshot
        SAVE_OS = dict()
        SAVE_OS.update(os.environ)

        self.init_with_cmd(cleanArg)

        self.do_eval_pack()

        if opt["Reset"][1] is True:
            #  self.unsetPath(BaseEnv.get_key_pack_info())
            #  self.unsetPath(BaseEnv.get_key_config_info())
            self.unsetPath(BaseEnv.get_command_info())

        else:
            if app != "":
                self.add_command("-a %s" % app)
            self.build_command_history()

        if app == "":
            if writefile == "":
                if fromPython is True:
                    if opt['DictOnly'][1] is True:
                        self.reset_cache()
                        self.endlog()
                        return True

                    os.environ.update(self.get_environ(withRemoveCmd=False))
                    self.expand_vars(os.environ)

                    newpath = list()
                    for p in sys.path:
                        if p.startswith(sys.prefix):
                            newpath.append(p)

                    if 'PYTHONPATH' in os.environ:
                        newpath.extend(os.environ['PYTHONPATH'].split(
                            os.pathsep))
                    sys.path = newpath  # reset the sys.path
                    self.reset_cache()
                    self.endlog()
                    return True

                else:
                    self.echo_environ_diff_only(SAVE_OS)
                    self.endlog()
                    return True
            else:
                sys.stderr.write("write file %s\n" % writefile)
                self.write_environ(SAVE_OS, writefile)
                self.endlog()
                return True

        if fromPython is False:
            self.write_bash_history()
            # we still need to update the calling
            # shell with the command history

        cmd = [app]
        if len(cmdLines) == 2:
            apparg = cmdLines[1]
            cmd.extend(apparg.split())
        #  self.logfile("2")
        os.environ.update(self.get_environ(withRemoveCmd=False))
        self.expand_vars(os.environ)
        self.reset_cache()
        #  self.logfile("3")

        self.logfile("execute: %s" % " ".join(cmd))
        thelog = self.getlog()
        p = None
        if thelog and opt["Deamon"][1] is True:
            sys.stderr.write("IN SUBProcess start\n")
            self.endlog()
            thelog = open(logfile, "a+")
            x = LaunchApp(cmd, thelog)
            x.start()

        else:
            if thelog:
                sys.stderr.write("IN SUBProcess start2\n")
                p = subprocess.Popen(" ".join(cmd),
                                     stdin=subprocess.PIPE,
                                     stdout=subprocess.PIPE,
                                     stderr=subprocess.STDOUT,
                                     shell=True,
                                     close_fds=True)

                if p.wait() != 0:
                    self.logfile("ERROR: %s" % " ".join(cmd))

                result = p.stdout.readlines()
                p.stdout.close()
                thelog.write("\n".join(result))

            else:
                sys.stderr.write("IN SUBProcess start3\n")
                # sys.stderr.write("%s\n" % sys.stdout)
                # sys.stderr.write("err %s\n" % sys.stderr)
                p = subprocess.Popen(cmd,
                                     stdout=None,
                                     stderr=None,
                                     shell=True,
                                     close_fds=True)
                # import time
                # time.sleep(30)

        if p:
            self.logfile("Launched %r with processid %d" % (app, p.pid))
        self.endlog()