On Jul 14, 2010, at 8:38 AM, Alan wrote:

> Hi there,
> 
> Module commands is gone in python3, so I am trying subprocess. So please I 
> would appreciate if someone can tell me how to do this better:
> 
> before I had:
> 
> cmd = 'uname -a'
> out = commands.getoutput(cmd)
> 
> 'Darwin amadeus.local 10.4.0 Darwin Kernel Version 10.4.0: Fri Apr 23 
> 18:28:53 PDT 2010; root:xnu-1504.7.4~1/RELEASE_I386 i386 i386 MacBookPro5,2 
> Darwin'
> 
> now:
> 
> out = sub.Popen(cmd, shell=True, stderr = sub.STDOUT, stdout = 
> sub.PIPE).communicate()[0][:-1]
> 
> b'Darwin amadeus.local 10.4.0 Darwin Kernel Version 10.4.0: Fri Apr 23 
> 18:28:53 PDT 2010; root:xnu-1504.7.4~1/RELEASE_I386 i386 i386 MacBookPro5,2 
> Darwin'
> 
> Yes, it's ugly. the [:-1] above is to get read of the last '\n' which with 
> getoutputs I didn't have. But what's giving headache is this "b'..." in the 
> beginning.
> 
> Can someone explain, point me to where I can now about it and how to make 
> this better? I wanted a plain string in out.
> 
> Many thanks in advance,
> 
> Alan

There are 2 string types in Python: byte strings and unicode strings. In Python 
2.x, they were called str and unicode, the default was str, and unicode was 
signaled by prefixing the string with a u. In python 3.x, they are called bytes 
and str. str (which is what used to be unicode) is the default, and a byte 
string (what used to be str) is signaled by putting a b in front of the string.

Unicode is an abstract concept. Python can move it around internally, but the 
only thing you can send to other computers and programs is a sequence of bytes. 
If you want to convert the byte string to a unicode string, you have to decode 
it afterwards.

out = out.decode("utf-8")


-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to