| Store | Cart

Re: [Python-Dev] subprocess.Popen and win32

From: Victor Stinner <vict...@gmail.com>
Sun, 20 Apr 2014 03:43:50 -0400
On Python 3, you can use Unicode on all platforms. On UNIX, there is no
need to encode explicitly.

Victor
Le 20 avr. 2014 04:17, "David Aguilar" <dav...@gmail.com> a écrit :

> Hi,>> I just joined python-dev because I found the need to add some code to> paper over python3's subprocess API, and I'm wondering whether I'm> missing something.>> On python2 and python3, the (only?) way to get utf-8 arguments to> subprocess was to ensure that all unicode strings are encoded into> bytes before subprocess sees them. This has worked for a long time> (currently compatible across python2 and 3).>> On python3, this still works for normal platforms, but on windows we> can't pass a list of byte strings. We have to pass a list of unicode> strings.>> This means that the application code ends up needing to do this:>> https://github.com/git-cola/git-cola/commit/1109aeb4354c49931d9b0435d2b7cfdc2d5d6966>> basically,>> def start_command(cmd):>     if sys.platform == 'win32':>         # Python on windows always goes through list2cmdline() internally> inside>         # of subprocess.py so we must provide unicode strings here> otherwise>         # Python3 breaks when bytes are provided.>         cmd = [decode(c) for c in cmd]>     else:>         cmd = [encode(c) for c in cmd]>      return subprocess.Popen(cmd)>> That seems broken to me, so I wonder if this is a bug in the way> python3 is handling Popen with list-of-bytestring on win32?>> I'm not a windows user, but I was able to install python3 under wine> and the same traceback happens without the paper bag fix. This is what> the traceback looks like; it dies in list2cmdline (which I am not> calling directly, Popen does it under the covers):>>     File "E:\Program Files> (E)\git-cola\share\git-cola\lib\cola\core.py", line 109, in> start_command>     universal_newlines=universal_newlines)>     File "C:\Python32\lib\subprocess.py", line 744, in __init__>     restore_signals, start_new_session)>     File "C:\Python32\lib\subprocess.py", line 936, in _execute_child>     args = list2cmdline(args)>     File "C:\Python32\lib\subprocess.py", line 564, in list2cmdline>     needquote = (" " in arg) or ("\t" in arg) or not arg>     TypeError: Type str doesn't support the buffer API>> This is an issue for folks that use python to write cross-platform> code. The unix code paths expect list-of-bytes, but win32 only expects> list-of-unicode, which pushes the burden onto the application> programmer.>> It's my opinion that the win32 code path on python3 is the odd man> out. If it allowed list-of-bytes like python2/win32 and python2+3/unix> then this wouldn't be an issue.>> Is this an actual problem, or is it something that should be handled> by application-level code as I've done?>> Thanks,> --> David> _______________________________________________> Python-Dev mailing list> Pyth...@python.org> https://mail.python.org/mailman/listinfo/python-dev> Unsubscribe:> https://mail.python.org/mailman/options/python-dev/victor.stinner%40gmail.com>

_______________________________________________
Python-Dev mailing list
Pyth...@python.org
https://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: https://mail.python.org/mailman/options/python-dev/python-dev-ml%40activestate.com

Recent Messages in this Thread
David Aguilar Apr 20, 2014 02:02 am
Victor Stinner Apr 20, 2014 07:43 am
Antoine Pitrou Apr 20, 2014 09:42 am
David Aguilar Apr 20, 2014 08:28 pm
Messages in this thread