[GRASSGUI] Re: [GRASS-dev] d.rast.edit in wxgrass

Glynn Clements glynn at gclements.plus.com
Sat Jun 16 15:53:10 EDT 2007


Michael Barton wrote:

> >>>> GRASS command parsing from the wxgrass CLI:
> >>>> 
> >>>> Split the command into a list by spaces. I realize that this is a problem
> >>>> for any command with spaces in the arguments, but I know of no better way
> >>>> to
> >>>> do this in this context outside of making users type any command as a
> >>>> Python
> >>>> list. If we made people type ['g.region', 'rast=mymap', 'res=30'] instead
> >>>> of
> >>>> g.region rast=mymap res=30, I don't think anyone would want to use the CLI.
> >>> 
> >>> This is one case where shell=True *is* legitimate. At least with a
> >>> shell, the user can use quotes or backslashes to include spaces in
> >>> arguments. Or you could implement equivalent functionality yourself.
> >> 
> >> IIUC, if I keep these as strings, I don't think I can use the cmd.Command
> >> class and would have to do a custom version of Popen. Then I'd have to send
> >> them through a different processing path rather than the RunCmd method that
> >> everything else uses.
> > 
> > One option is to call the shell explicitly, i.e.:
> > 
> > cmd.Command(['/bin/sh', '-c', cmdstr], ....)
> > 
> > or (on Windows):
> > 
> > cmd.Command(['cmd', '/c', cmdstr], ...)
> > 
> > Simply adding quoting to the existing implementation would probably be
> > preferable, though.
> 
> Martin,
> 
> Is this change in cmd.Command easy to implement?

The above isn't a change to cmd.Command(), but a change to how it is
used.

If you were to change cmd.Command(), the obvious change would be to
add a shell= parameter, which would be propagated directly to Popen().

Ultimately, if all you have is a single string provided by the user,
that string somehow has to be converted to a list of strings (as
that's what argv[] is).

The options are:

1. Split at each space.
2. As for 1, but with a quoting and/or escaping mechanism.
3. Use the shell.

1 fails to handle arguments which contain spaces. 2 solves this, but
requires some work. 3 gets the shell to do the work, but the cost is
that you get a lot of other stuff which you may not want
(substitution, redirection, loops, subshells, ...).

-- 
Glynn Clements <glynn at gclements.plus.com>




More information about the grass-dev mailing list