[GRASS-dev] [GRASS GIS] #2532: TypeError: environment can only contain string when launching script on Windows
GRASS GIS
trac at osgeo.org
Tue Jan 20 18:49:26 PST 2015
#2532: TypeError: environment can only contain string when launching script on
Windows
-------------------------+--------------------------------------------------
Reporter: annakrat | Owner: grass-dev@…
Type: defect | Status: new
Priority: normal | Milestone: 7.0.0
Component: Default | Version: svn-trunk
Keywords: encoding | Platform: MSWindows 8
Cpu: Unspecified |
-------------------------+--------------------------------------------------
Comment(by annakrat):
Replying to [comment:16 glynn]:
> Replying to [comment:15 annakrat]:
>
> > No, when I print the string I get xml, seems to be valid:
> >
> {{{
> <?xml version="1.0" encoding="UTF-8"?>
> <!DOCTYPE task SYSTEM "C:\Users\akratoc\Programs\GRASS GIS
7.1.svn\gui\xml\grass-interface.dtd">
> <task name="test_workshopá.py">
> }}}
> > I don't understand what's wrong with it.
>
> The name= attribute will fail to decode due to not being valid UTF-8.
The "á" will be encoded in cp1252 (i.e. '\xe1'); attempting to decode that
as UTF-8 will fail (non-ASCII characters are encoded as multi-byte
sequences; an isolated byte >= 128 can never occur in UTF-8).
I take it that we are supporting only ascii characters in the script name.
>
> > > In any case, the GUI should be encoding the arguments which it
passes to Popen(); it shouldn't be passing unicode values.
> >
> > Should the be encoding moved to `get_interface_description` in
task.py?
>
> No. The GUI shouldn't be passing unicode values to the grass.script
library; it should be converting them to strings itself.
Ok.
>
> > The `EncodeString` function is in gui, not in python scripting
library.
>
> grass.script.core has encode() and decode().
>
> > If I try to run the script (this time the script name is only ascii,
but the path has some non-ascii characters which are in cp1252), I get the
gui dialog and when I run it, I get an error:
>
> Ugh. I couldn't figure out what was happening here until I read the next
sentence. It appears that str.encode() actually exists; it tries to
convert the string to unicode (using the default encoding) so that it can
encode it.
>
> > because in Popen class in
[http://trac.osgeo.org/grass/browser/grass/trunk/gui/wxpython/core/gcmd.py#L161
gcmd.py] some of the arguments are of type `str`, some are `unicode`. So
if encode only the unicode ones, it starts to work.
>
> That makes sense. But the encoding should ideally be done at a higher
level, at the point that wxGUI "knows" that it's dealing with a unicode
value.
I am not sure where the higher level is and why str and unicode are mixed
in this case.
>
>
> I'm wondering if sys.setdefaultencoding("EBCDIC-CP-BE") would work ...
Why would it? Is it easy to test?
Anyway, I think whatever we do, shouldn't get into the current release. I
already fixed the important part (works with ascii path only) and I don't
want to make things worse.
--
Ticket URL: <http://trac.osgeo.org/grass/ticket/2532#comment:17>
GRASS GIS <http://grass.osgeo.org>
More information about the grass-dev
mailing list