def __init__(self, path=None, wait_time=10, quit_ds9_on_del=True, load_help_file=True): """ path :path of the ds9 wait_time : waiting time before error is raised quit_ds9_on_del : If True, try to quit ds9 when this instance is deleted. """ # determine whther to quit ds9 also when object deleted. self.quit_ds9_on_del = quit_ds9_on_del self._need_to_be_purged = False if path is None: self.path = _find_ds9() else: self.path = path self.xpa_name, self.ds9_unix_name = self.run_unixonly_ds9_v2(wait_time) self.xpa = xpa.XPA(self.xpa_name) # numdisp setup self.numdisp_dev = "unix:%s" % self.ds9_unix_name verbose.report("establish numdisplay connection (%s)" % (self.numdisp_dev,), level="debug") self.numdisp = displaydev.ImageDisplayProxy(self.numdisp_dev) self._ds9_version = self.get("version").strip() if load_help_file: self._helper = ds9_xpa_help.get(self) else: self._helper = None self._need_to_be_purged = True
def _convert_syntax(l): l, c = takeout_comment(l) # SET if p_xpaset_w_echo.search(l): #print l r = p_xpaset_w_echo.subn(r"ds9.set('\2', \1)", l)[0] elif p_xpaset_w_cat.search(l): s = r"r=open('\1').read(); ds9.set('\2', r)" r = p_xpaset_w_cat.subn(s, l)[0] elif p_xpaset.search(l): r = p_xpaset.subn(r"ds9.set('\1')", l)[0] elif p_xpaset_wo_ds9.search(l): r = p_xpaset_wo_ds9.subn(r"ds9.set('\1')", l)[0] # GET elif p_xpaget_w_redirect.search(l): s = r"r = ds9.get('\1'); open('\2','w').write(r)" r = p_xpaget_w_redirect.subn(s, l)[0] elif p_xpaget_mask.search(l): r = p_xpaget_mask.subn(r"r = ds9.get('mask \1')", l)[0] elif p_xpaget.search(l): r = p_xpaget.subn(r"r = ds9.get('\1')", l)[0] else: if l: if not l[0] == "#": verbose.report("WARNING : failed to convert (%s)" % l, "helpful") r = l if c: r = r + " " + c return r
def __init__(self, path=None, wait_time=10, quit_ds9_on_del=True, load_help_file=True, **kwargs): """ path :path of the ds9 wait_time : waiting time before error is raised quit_ds9_on_del : If True, try to quit ds9 when this instance is deleted. Any additional keyword arguments will be passed a command line arguments to execute ds9. For example, pysao.ds9(title="test") will add following arguments when executing the ds9. '-title test' """ # determine whther to quit ds9 also when object deleted. self.quit_ds9_on_del = quit_ds9_on_del self._need_to_be_purged = False if path is None: self.path = _find_ds9() else: self.path = path self.xpa_name, self.ds9_unix_name = self.run_unixonly_ds9_v2( wait_time, kwargs) self.xpa = xpa.XPA(self.xpa_name) # numdisp setup self.numdisp_dev = "unix:%s" % self.ds9_unix_name verbose.report("establish numdisplay connection (%s)" % (self.numdisp_dev, ), level="debug") self.numdisp = displaydev.ImageDisplayProxy(self.numdisp_dev) self._ds9_version = self.get("version").strip() if load_help_file: self._helper = ds9_xpa_help.get(self) else: self._helper = None self._need_to_be_purged = True
def _purge(self): if not self._need_to_be_purged: return if not self.quit_ds9_on_del: verbose.report("You need to manually delete tmp. dir (%s)" % (self._tmpd_name), level="helpful") self._need_to_be_purged = False return if self.numdisp: self.numdisp.close() try: if self._ds9_process.poll() is None: self.set("quit") except xpa.XpaException as err: verbose.report("Warning : " + err.message) try: shutil.rmtree(self._tmpd_name) #os.rmdir(self._tmpd_name) self._tmp_dir_list.remove(self._tmpd_name) except OSError: verbose.report("Warning : couldn't delete the temporary directory (%s)" % (self._tmpd_name,)) else: verbose.report("temporary directory deleted", level="debug") self._need_to_be_purged = False
def _purge(self): if not self._need_to_be_purged: return if not self.quit_ds9_on_del: verbose.report("You need to manually delete tmp. dir (%s)" % (self._tmpd_name), level="helpful") self._need_to_be_purged = False return if self.numdisp: self.numdisp.close() try: if self._ds9_process.poll() is None: self.set("quit") except xpa.XpaException as err: verbose.report("Warning : " + err.message) try: shutil.rmtree(self._tmpd_name) #os.rmdir(self._tmpd_name) self._tmp_dir_list.remove(self._tmpd_name) except OSError: verbose.report( "Warning : couldn't delete the temporary directory (%s)" % (self._tmpd_name, )) else: verbose.report("temporary directory deleted", level="debug") self._need_to_be_purged = False
def get_help(self): r = dict() for k, v in self.help_strings.items(): s = v.getvalue() v.close() ## Syntax : ss = p_sy.split(s) if len(ss) == 1: # a special case for "psprint" with only description. #print "whats going on?", k, ss expl = ss[0].replace("\240", " ") syntax = "" example = "" elif len(ss) == 2: expl, _rest = ss ## Example : syntax, example = p_ex.split(_rest) syntax = _reindent_syntax(syntax, k) ex_ = [ _convert_example(l.strip()) for l in example.split("\n") if l.strip() ] example = "\n".join(ex_) else: verbose.report("ignoring %s : failed to parse." % k) continue # fix expl extra_kewords = ["cat", "quit", "pmagnifier"] filtered_expl = [ l1 for l in expl.split("\n") for l1 in [l.strip()] if l1 and l1 != k and l1 not in extra_kewords ] #expl r[k] = dict(expl=" ".join(filtered_expl), syntax=syntax, example=example) return r
def _purge(self): if not self._need_to_be_purged: return if not self.quit_ds9_on_del: verbose.report("You need to manually delete tmp. dir (%s)" % (self._tmpd_name), level="helpful") self._need_to_be_purged = False return if self.numdisp: self.numdisp.close() try: if self._ds9_process.poll() is None: self.set("quit") except xpa.XpaException, err: verbose.report("Warning : " + err.message)
def __init__(self, path=None, wait_time=10, quit_ds9_on_del=True, load_help_file=True, **kwargs): """ path :path of the ds9 wait_time : waiting time before error is raised quit_ds9_on_del : If True, try to quit ds9 when this instance is deleted. Any additional keyword arguments will be passed a command line arguments to execute ds9. For example, pysao.ds9(title="test") will add following arguments when executing the ds9. '-title test' """ # determine whther to quit ds9 also when object deleted. self.quit_ds9_on_del = quit_ds9_on_del self._need_to_be_purged = False if path is None: self.path = _find_ds9() else: self.path = path self.xpa_name, self.ds9_unix_name = self.run_unixonly_ds9_v2(wait_time, kwargs) self.xpa = xpa.XPA(self.xpa_name) # numdisp setup self.numdisp_dev = "unix:%s" % self.ds9_unix_name verbose.report("establish numdisplay connection (%s)" % (self.numdisp_dev,), level="debug") self.numdisp = displaydev.ImageDisplayProxy(self.numdisp_dev) self._ds9_version = self.get("version").strip() if load_help_file: self._helper = ds9_xpa_help.get(self) else: self._helper = None self._need_to_be_purged = True
def get_help(self): r = dict() for k, v in self.help_strings.items(): s = v.getvalue() v.close() ## Syntax : ss = p_sy.split(s) if len(ss) == 1: # a special case for "psprint" with only description. #print "whats going on?", k, ss expl = ss[0].replace("\240", " ") syntax = "" example = "" elif len(ss) == 2: expl, _rest = ss ## Example : syntax, example = p_ex.split(_rest) syntax = _reindent_syntax(syntax, k) ex_ = [_convert_example(l.strip()) for l in example.split("\n") if l.strip()] example = "\n".join(ex_) else: verbose.report("ignoring %s : failed to parse." % k) continue # fix expl extra_kewords = ["cat", "quit", "pmagnifier"] filtered_expl = [l1 for l in expl.split("\n") for l1 in [l.strip()] if l1 and l1 != k and l1 not in extra_kewords] #expl r[k] = dict(expl=" ".join(filtered_expl), syntax=syntax, example=example) return r
def __init__(self, path=None, wait_time=10, quit_ds9_on_del=True, load_help_file=True): """ path :path of the ds9 wait_time : waiting time before error is raised quit_ds9_on_del : If True, try to quit ds9 when this instance is deleted. """ # determine whther to quit ds9 also when object deleted. self.quit_ds9_on_del = quit_ds9_on_del self._need_to_be_purged = False if path is None: self.path = _find_ds9() else: self.path = path self.xpa_name, self.ds9_unix_name = self.run_unixonly_ds9_v2(wait_time) self.xpa = xpa.XPA(self.xpa_name) # numdisp setup self.numdisp_dev = "unix:%s" % self.ds9_unix_name verbose.report("establish numdisplay connection (%s)" % (self.numdisp_dev, ), level="debug") self.numdisp = displaydev.ImageDisplayProxy(self.numdisp_dev) self._ds9_version = self.get("version").strip() if load_help_file: self._helper = ds9_xpa_help.get(self) else: self._helper = None self._need_to_be_purged = True
def _convert_example(l): l, c = takeout_comment(l) if l.strip() in example_typo: l = example_typo[l.strip()] # SET if p_xpaset_w_echo.search(l): r = p_xpaset_w_echo.subn(r"ds9.set('\2', \1)", l)[0] elif p_xpaset_w_cat.search(l): s = r"r=open('\1').read(); ds9.set('\2', r)" r = p_xpaset_w_cat.subn(s, l)[0] elif p_xpaset.search(l): r = p_xpaset.subn(r"ds9.set('\1')", l)[0] elif p_xpaset_wo_ds9.search(l): r = p_xpaset_wo_ds9.subn(r"ds9.set('\1')", l)[0] # GET elif p_xpaget_w_redirect.search(l): s = r"r = ds9.get('\1'); open('\2','w').write(r)" r = p_xpaget_w_redirect.subn(s, l)[0] elif p_xpaget_mask.search(l): r = p_xpaget_mask.subn(r"r = ds9.get('mask \1')", l)[0] elif p_xpaget.search(l): r = p_xpaget.subn(r"r = ds9.get('\1')", l)[0] else: if l: if not l[0] == "#": verbose.report("WARNING : failed to convert (%s)" % l, "helpful") r = l if c: r = r + " " + c return r
def _purge_tmp_dirs(cls): """ When used with ipython (pylab mode), it seems that the objects are not prperly deleted, i.e., temporary directories are not deleted. This is a work around for that. """ for tds9_ref in cls._ds9_instance_list: verbose.report("purging remaning ds9 instances", "debug") tds9 = tds9_ref() if tds9 is not None: verbose.report("deleting ds9", "debug") tds9._purge() if cls._tmp_dir_list: verbose.report("purging remaning temporary dirs", "debug") for d in cls._tmp_dir_list: shutil.rmtree(d)
from .version import __version__ from pysao.verbose import verbose try: from .astropy_helper import pyfits except ImportError: verbose.report("Loading pyfits failed. pysao.ds9 would not support fits-related tasks in this mode.", level="debug") import pysao.ds9_basic as _ds9 else: verbose.report("Loading pyfits succeded. pysao.ds9 will support fits-related tasks.", level="debug") import pysao.ds9_pyfits as _ds9 ds9 = _ds9.ds9 #import sla #import slav
def run_unixonly_ds9_v2(self, wait_time): """ start ds9 """ # when xpaname is parsed for local, # the prefix should match the XPA_TMPDIR # Hence, we create temporary dir under that directory. # The env variable "XPA_TMPDIR" is set to correct value when ds9 is # runned, and also xpa command is called (ie, python process). # This is a bit of problem when we have multiple instance of ds9. #env = os.environ.copy() env = os.environ self._tmpd_name = mkdtemp(prefix="xpa_"+env.get("USER",""), dir="/tmp") verbose.report("temporary directory created (%s)" % (self._tmpd_name,), level="debug") #print self._tmpd_name env["XPA_TMPDIR"] = self._tmpd_name iraf_unix = "%s/.IMT" % self._tmpd_name try: verbose.report("starting ds9 (path=%s)" % (self.path,), level="debug") #p = Popen(" ".join([self.path, # "-xpa local", # "-xpa noxpans", # "-unix_only", # "-unix %s &" % iraf_unix]), # shell=True, env=env) p = Popen([self.path, "-xpa", "local", "-xpa", "noxpans", "-unix_only", "-unix", "%s" % iraf_unix], shell=False, env=env) #sts = os.waitpid(p.pid, 0) # wait until ds9 starts while wait_time > 0: file_list = os.listdir(self._tmpd_name) if len(file_list)>1: #print file_list break time.sleep(0.5) wait_time -= 0.5 else: from signal import SIGTERM os.kill(p.pid, SIGTERM) raise OSError("Connection timeout with the ds9. Try to increase the *wait_time* parameter (current value is %d s)" % (wait_time,)) except: verbose.report("running ds9 failed", level="debug") os.rmdir(self._tmpd_name) verbose.report("temporary directory deleted", level="debug") raise else: self._tmp_dir_list.add(self._tmpd_name) self._ds9_instance_list.append(weakref.ref(self)) self._ds9_process = p file_list.remove(".IMT") xpaname = os.path.join(self._tmpd_name, file_list[0]) env["XPA_TMPDIR"] = "/tmp/xpa" #self._tmpd_name return xpaname, iraf_unix
def __del__(self): verbose.report("deleteing pysao.ds9", level="debug") self._purge()
def run_unixonly_ds9_v2(self, wait_time, cmd_args_dict=None): """ start ds9 """ # when xpaname is parsed for local, # the prefix should match the XPA_TMPDIR # Hence, we create temporary dir under that directory. # The env variable "XPA_TMPDIR" is set to correct value when ds9 is # runned, and also xpa command is called (ie, python process). # This is a bit of problem when we have multiple instance of ds9. #env = os.environ.copy() env = os.environ self._tmpd_name = mkdtemp(prefix="xpa_" + env.get("USER", ""), dir="/tmp") verbose.report("temporary directory created (%s)" % (self._tmpd_name, ), level="debug") #print self._tmpd_name env["XPA_TMPDIR"] = self._tmpd_name iraf_unix = "%s/.IMT" % self._tmpd_name try: verbose.report("starting ds9 (path=%s)" % (self.path, ), level="debug") cmd_args = [ "-xpa", "local", "-xpa", "noxpans", "-unix_only", "-unix", "%s" % iraf_unix ] for k, v in cmd_args_dict.items(): cmd_args.extend(["-%s" % k, v]) p = Popen([self.path] + cmd_args, shell=False, env=env) #sts = os.waitpid(p.pid, 0) # wait until ds9 starts countdown = wait_time while countdown > 0: file_list = os.listdir(self._tmpd_name) if len(file_list) > 1: #print file_list break time.sleep(0.5) countdown -= 0.5 else: from signal import SIGTERM os.kill(p.pid, SIGTERM) raise OSError( "Connection timeout with the ds9. Try to increase the *wait_time* parameter (current value is %d s)" % (wait_time, )) except: verbose.report("running ds9 failed", level="debug") os.rmdir(self._tmpd_name) verbose.report("temporary directory deleted", level="debug") raise else: self._tmp_dir_list.add(self._tmpd_name) self._ds9_instance_list.append(weakref.ref(self)) self._ds9_process = p file_list.remove(".IMT") xpaname = os.path.join(self._tmpd_name, file_list[0]) env["XPA_TMPDIR"] = "/tmp/xpa" #self._tmpd_name return xpaname, iraf_unix
from .version import __version__ from pysao.verbose import verbose try: from .astropy_helper import pyfits except ImportError: verbose.report( "Loading pyfits failed. pysao.ds9 would not support fits-related tasks in this mode.", level="debug") import pysao.ds9_basic as _ds9 else: verbose.report( "Loading pyfits succeded. pysao.ds9 will support fits-related tasks.", level="debug") import pysao.ds9_pyfits as _ds9 ds9 = _ds9.ds9 #import sla #import slav