[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