refine py.process.cmdexec handling wrt unicode on all python versions
--HG-- branch : trunk
This commit is contained in:
		
							parent
							
								
									4d75c703a0
								
							
						
					
					
						commit
						f856db29dc
					
				|  | @ -48,6 +48,8 @@ Bug fixes / Maintenance | ||||||
| - don't print empty lines when showing junitxml-filename | - don't print empty lines when showing junitxml-filename | ||||||
| - add optional boolean ignore_errors parameter to py.path.local.remove | - add optional boolean ignore_errors parameter to py.path.local.remove | ||||||
| - fix terminal writing on win32/python2.4  | - fix terminal writing on win32/python2.4  | ||||||
|  | - py.process.cmdexec() now tries harder to return properly encoded unicode objects  | ||||||
|  |   on all python versions | ||||||
| 
 | 
 | ||||||
| Changes between 1.3.0 and 1.3.1 | Changes between 1.3.0 and 1.3.1 | ||||||
| ================================================== | ================================================== | ||||||
|  |  | ||||||
|  | @ -8,18 +8,25 @@ import py | ||||||
| from subprocess import Popen, PIPE | from subprocess import Popen, PIPE | ||||||
| 
 | 
 | ||||||
| def cmdexec(cmd): | def cmdexec(cmd): | ||||||
|     """ return output of executing 'cmd' in a separate process. |     """ return unicode output of executing 'cmd' in a separate process. | ||||||
| 
 | 
 | ||||||
|     raise cmdexec.ExecutionFailed exeception if the command failed. |     raise cmdexec.ExecutionFailed exeception if the command failed. | ||||||
|     the exception will provide an 'err' attribute containing |     the exception will provide an 'err' attribute containing | ||||||
|     the error-output from the command. |     the error-output from the command. | ||||||
|  |     if the subprocess module does not provide a proper encoding/unicode strings | ||||||
|  |     sys.getdefaultencoding() will be used, if that does not exist, 'UTF-8'. | ||||||
|     """ |     """ | ||||||
|     process = subprocess.Popen(cmd, shell=True,  |     process = subprocess.Popen(cmd, shell=True,  | ||||||
|             universal_newlines=True, |             universal_newlines=True, | ||||||
|             stdout=subprocess.PIPE, stderr=subprocess.PIPE) |             stdout=subprocess.PIPE, stderr=subprocess.PIPE) | ||||||
|     out, err = process.communicate() |     out, err = process.communicate() | ||||||
|     out = py.builtin._totext(out, sys.stdout.encoding) |     if sys.version_info[0] < 3: # on py3 we get unicode strings, on py2 not  | ||||||
|     err = py.builtin._totext(err, sys.stderr.encoding) |         try: | ||||||
|  |             default_encoding = sys.getdefaultencoding() # jython may not have it | ||||||
|  |         except AttributeError: | ||||||
|  |             default_encoding = sys.stdout.encoding or 'UTF-8' | ||||||
|  |         out = unicode(out, process.stdout.encoding or default_encoding) | ||||||
|  |         err = unicode(err, process.stderr.encoding or default_encoding) | ||||||
|     status = process.poll() |     status = process.poll() | ||||||
|     if status: |     if status: | ||||||
|         raise ExecutionFailed(status, status, cmd, out, err) |         raise ExecutionFailed(status, status, cmd, out, err) | ||||||
|  |  | ||||||
|  | @ -8,11 +8,13 @@ class Test_exec_cmd: | ||||||
|     def test_simple(self): |     def test_simple(self): | ||||||
|         out = cmdexec('echo hallo') |         out = cmdexec('echo hallo') | ||||||
|         assert out.strip() == 'hallo' |         assert out.strip() == 'hallo' | ||||||
|  |         assert py.builtin._istext(out) | ||||||
| 
 | 
 | ||||||
|     def test_simple_newline(self): |     def test_simple_newline(self): | ||||||
|         import sys |         import sys | ||||||
|         out = cmdexec(r"""%s -c "print ('hello')" """ % sys.executable) |         out = cmdexec(r"""%s -c "print ('hello')" """ % sys.executable) | ||||||
|         assert out == 'hello\n' |         assert out == 'hello\n' | ||||||
|  |         assert py.builtin._istext(out) | ||||||
| 
 | 
 | ||||||
|     def test_simple_error(self): |     def test_simple_error(self): | ||||||
|         py.test.raises (cmdexec.Error, cmdexec, 'exit 1') |         py.test.raises (cmdexec.Error, cmdexec, 'exit 1') | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue