<div dir="ltr">Dear all,<br><br><div>after looking at different Python 2 to 3 porting issues, doing r71849, and reading #3392, I understand the following:</div><div><br></div><div>* Several solutions for poring exist. Most recent one is python-future project, but only from __future__ import ... is part of the library and thus guaranteed with recent Python 2.7. (We can discuss concrete steps separately.)<br></div><div><br></div><div>* However, the most challenging part of the porting will be the unicode.<br></div><div><br></div><div>* There is no way around the unicode when using Python 3. Unicode is inherent part of the language even things such as os.environ or sys.stdout.write() work only with unicode. I'm not sure what exactly the rule is here, but it seems to be everywhere.<br></div><div><br></div><div>* I haven't seen any simple fix which would limit the changes in the code in a way, e.g., in which print statement can be fixed.</div><div><br></div><div>* GUI will always use unicode because that's how the libraries and interfaces as set.<br></div><div><br></div><div>* In relation to the previous point, one of the reasons why unicode is used that thinks like text[:10] actually return 10 characters to display.</div><div><br></div><div>* C library will not use unicode for now.<br></div><div><br></div><div>* Users of the Python API who are using Python 3 will expect unicode strings to work, i.e. expect run_command('g.region', flags='p') to work (not just run_command(b'g.region', flags=b'p')).</div><div><br></div><div>* If Python libraries are unicode, there will need to be an interface to work with ctypes which would add to existing code for transferring from C world to Python and back.</div><div><br></div><div>* If Python libraries are bytes, there will need to be an interface to work with GUI in unicode as well as with users of the API who will expect unicode to work. In other words, internally it would use bytes, but interface must be both bytes (for modules and internal use) and unicode (for GUI and users).</div><div><br></div><div>* Having unicode-based library means encoding and decoding on any "external" interface such as file reading or ctypes.</div><div><br></div><div>* Having bytes-based library means encoding and decoding on any interface such as Python 3 interface such as os.environ and additionally rewriting all string literals ("abc") to bytes (b"abc").</div><br>* It seems hard to predict when we will know the right encoding of the text. It seems that we will need it with any solution since garbage-in-garbage stops when you need to use some system interface function in Python 3 which requires unicode. Although e.g. sys.stdout.write() has a (less generic) sys.stdout.buffer.write() alternative, os.environb does not work on MS Windows.<br><br><div>An example fix in r71849 is done using a (custom) decode function which creates unicode (standard string in Python3) when file content is read. Alternative to this change would be changing all the strings in the file to bytes (b'abc' as opposed to 'abc').<br></div><div></div><div><br></div><div>Please comment or link other related discussions.<br></div><div><br></div><div>Thanks,<br></div><div>Vaclav</div><div><br></div><div></div><div><br></div><div>python3 -c "import os; os.environ[b'abc'] = b'def'"</div><div>python3 -c "import os; os.environb[b'abc'] = b'def'"</div><div>python3 -c "import sys; sys.stdout.write(b'abc\n')"</div><div>python3 -c "import sys; sys.stdout.buffer.write(b'abc\n')"</div><div>python3 -c "import os; print(type(<a href="http://os.name">os.name</a>))"<br></div><div><a href="https://trac.osgeo.org/grass/changeset/71849">https://trac.osgeo.org/grass/changeset/71849</a></div><div></div><div><a href="https://trac.osgeo.org/grass/ticket/2708">https://trac.osgeo.org/grass/ticket/2708</a></div><div><a href="https://trac.osgeo.org/grass/ticket/3392">https://trac.osgeo.org/grass/ticket/3392</a></div><div><a href="https://trac.osgeo.org/grass/query?status=!closed&keywords=~python3">https://trac.osgeo.org/grass/query?status=!closed&keywords=~python3</a></div><div><a href="https://trac.osgeo.org/grass/query?status=!closed&keywords=~encoding">https://trac.osgeo.org/grass/query?status=!closed&keywords=~encoding</a></div><div><a href="https://trac.osgeo.org/grass/query?status=!closed&keywords=~unicode">https://trac.osgeo.org/grass/query?status=!closed&keywords=~unicode</a><br></div></div>