[GRASS-dev] making py.monitor listen to external commands

Benjamin Ducke benjamin.ducke at ufg.uni-kiel.de
Fri Jun 16 09:27:17 EDT 2006


Right, I fixed linker symbol problem by compiling wxpython
with exactly the same options as wxwidgets (both newest
versions).
Now I am back to the old error:

Traceback (most recent call last):
   File "mon.py", line 314, in ?
     main()
   File "mon.py", line 293, in main
     pymonitor = Monitor(0)
   File "/usr/lib/python2.4/site-packages/wx-2.6-gtk2-ansi/wx/_core.py", 
line 7473, in __init__
     self._BootstrapApp()
   File "/usr/lib/python2.4/site-packages/wx-2.6-gtk2-ansi/wx/_core.py", 
line 7125, in _BootstrapApp
     return _core_.PyApp__BootstrapApp(*args, **kwargs)
   File "mon.py", line 54, in OnInit
     self.initDrawArea()
   File "mon.py", line 101, in initDrawArea
     self.back.getRegion()
   File "/home/benni/grass-cvs/py.monitor-06-06-14-4/map/raster.py", 
line 138, in getRegion
     key,value = line.split(":")
ValueError: too many values to unpack


No idea what to do about this.
Btw.: if py.mon crashes before it even gets a chance to open a
monitor, it still leaves a lockfile .py0 in the current mapset
preventing it to start next time.

Best,

Benjamin


  Jáchym Čepický wrote:
> Hallo,
> 
> I just tryed the py.mon stuff on win xp box and it nearly worked :-) the window appears, but I did not manage to display any map.
> this just means, that used approach (python + wxwidget) seem really to work on windows and that it can use at least some commands from grass via os.system()
> 
> screenshot on les-ejk.cz/tmp/pymon-win.png [0.5 MB]
> 
> Have a nice weekend
> 
> Jachym
> 
> P.S. I used Wingrass (qgis+grass) precompiled package from Radim, started qgis, started GRASS-Shell and run. Maybe in commandline.exe it would work better?
> --
> Jachym Cepicky                                  
> e-mail: jachym.cepicky at centrum.cz                               
> URL: http://les-ejk.cz                                                         
> GPG: http://les-ejk.cz/gnupg_public_key/                   
> -----------------------------------------                                    
> OFFICE:                                                                        
> Department of Geoinformation Technologies         
> LDF MZLU v Brně                                                             
> Zemědělská 3                                                                   
> 613 00 Brno                                                                     
> e-mail: xcepicky at node.mendelu.cz                     
> URL:    http://mapserver.mendelu.cz
> Tel.:   +420 545 134 514
> 
> 
> 
> 
> 
> ______________________________________________________________
> 
>>Od: jachym.cepicky at centrum.cz
>>Komu: grass-dev at grass.itc.it
>>Datum: 12.06.2006 20:32
>>Předmět: [GRASS-dev] making py.monitor listen to external commands
>>
>>Hallo,
>>
>>I'm trying to script something, which could be in the future called
>>py.mon(itor) using wxpython together with xrc.
>>
>>The basic is here - I can display ppm file
>>
>>Now, I would like to make it "listen" to command line commands and I
>>have been thinking of approach like this:
>>
>>The idea is, you would tip just normal py.* commands in the command line,
>>but there would be process running in background, which would pick up
>>the last line from history file (e.g. .monitor_x0_history) and add it to
> 
> stack of
> 
>>commands for the monitor. 
>>
>>We would have to create set of py.* commands, which would replace the
>>d.* commands and general structure of this py.* commands would look like
>>this:
>>
>>---------------------------
>># py.rast
>>
>># get the selected monitor
>>monitor = os.getenv("GRASS_MONITOR")
>>
>># get the file name
>>command_file =
> 
> os.path.join(GISBASE,LOCATION,MAPSET,".monitor_"+monitor+"_history)
> 
>># write d.rast to commands
>>file = open(command_file,"a")
>>file.write("d.rast "+sys.arg[1:])
>>file.close()
>>---------------------------
>>
>>Then there should be loop in py.monitor:
>>
>>   1) watcher(), which would take care on the .monitor_x0_history file
> 
> just like tail -f does
> 
>>      if there would be some change, it would add command to the
>>       monitor commands stack and redraw the monitor with new set of
>>       commands
>>
>>   2) pymonitor.MainLoop(), which displays the gui and sets the
>>       variables
>>
>>So, I have monitor (see screenshot [1]), I can tip commands in some
>>"terminal" under the window. I have "watcher" which takes care on the
>>command file and if there is some change, it should set the "monitor
>>terminal" to the value of the command(s) to new command.
>>
>>But it does not because the processes do not "see" each other. I'm also
>>not able to kill the processes while closing the monitor, because of I'm
>>not able to get their PIDs.
>>
>>So my question: how to perform task like this? I know, this is task for
>>"reall" programmers, maybe I choosed completly wrong approach.
>>
>>I took the code from
>>http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/66012 and
>>modified it like this:
>>
>>-------------------------------
>>class Monitor(wx.App):
>>   """
>>   py.monitor gui
>>   """
>>
>>   def OnInit(self):
>>       """
>>       Init the gui
>>       """
>>
>>       try: 
>>           pid = os.fork() 
>>           if pid > 0:
>>               # exit first parent
>>               sys.exit(0) 
>>       except OSError, e: 
>>           print >>sys.stderr, "fork #1 failed: %d (%s)" % (e.errno,
>>   e.strerror) 
>>           sys.exit(1)
>>
>>       # decouple from parent environment
>>       os.setsid() 
>>       os.umask(0) 
>>
>>       # initialize the GUI
>>       self.initFrame()
>>       self.rast = map.raster.Raster()
>>       self.initToolBar()
>>       self.initCommands()
>>       self.initDrawArea()
>>       self.frame.Show()
>>
>>       # do second fork
>>       try: 
>>           pid = os.fork() 
>>           if pid > 0:
>>               # exit from second parent, print eventual PID before
>>               #print "Daemon PID %d" % pid 
>>               
>>               # OnInit should return boolean value
>>               return True 
>>
>>               #sys.exit(0) 
>>       except OSError, e: 
>>           print >>sys.stderr, "fork #2 failed: %d (%s)" % (e.errno,
>>   e.strerror) 
>>           sys.exit(1) 
>>
>>       # start the daemon watcher
>>       self.watcher()
>>
>>[....]
>>
>># startin the gui
>>def main():
>>   pymonitor = Monitor(0)
>>   pymonitor.MainLoop()
>>
>>-------------------------------
>>
>>Thanks for hints I hope, one can understand, what I wanted to say.
>>
>>Jachym
>>
>>[1] http://les-ejk.cz/tmp/py.monitor.png
>>-- 
>>Jachym Cepicky
>>e-mail: jachym.cepicky at centrum.cz
>>URL: http://les-ejk.cz
>>GPG: http://les-ejk.cz/gnupg_public_key/jachym_cepicky-gpg_public_key.asc
>>-----------------------------------------   
>>OFFICE:                                     
>>GDF-Hannover
>>Mengendamm 16d
>>30177 Hannover
>>Germany
>>e-mail: cepicky at gdf-hannover.de
>>URL:    http://gdf-hannover.de
>>Tel.:   +49 511-39088507
>>
>>_______________________________________________
>>grass-dev mailing list
>>grass-dev at grass.itc.it
>>http://grass.itc.it/mailman/listinfo/grass-dev
>>
> 
> 
> _______________________________________________
> grass-dev mailing list
> grass-dev at grass.itc.it
> http://grass.itc.it/mailman/listinfo/grass-dev
> 
> 

-- 
Benjamin Ducke, M.A.
Archäoinformatik
(Archaeoinformation Science)
Institut für Ur- und Frühgeschichte
(Inst. of Prehistoric and Historic Archaeology)
Christian-Albrechts-Universität zu Kiel
Johanna-Mestorf-Straße 2-6
D 24098 Kiel
Germany

Tel.: ++49 (0)431 880-3378 / -3379
Fax : ++49 (0)431 880-7300
www.uni-kiel.de/ufg




More information about the grass-dev mailing list