
Thanks for review, yes, I missed this situation: stdout is not the subprocess.PIPE. Since the stderr is always subprocess.PIPE, my another way is err after Popen.communicate(). The patch looks like: --- utils/utils.py | 2 ++--- 1 file changed, 2 insertions(+) diff --git a/utils/utils.py b/utils/utils.py index 147c1ef..d107cbd 100644 --- a/utils/utils.py +++ b/utils/utils.py @@ -412,6 +412,8 @@ def exec_cmd(command, sudo=False, cwd=None, infile=None, outfile=None, shell=Fal p = subprocess.Popen(command, shell=shell, close_fds=True, cwd=cwd, stdin=infile, stdout=outfile, stderr=subprocess.PIPE) (out, err) = p.communicate(data) if out == None: # Prevent splitlines() from barfing later on out = "" + if err != "": + out += err return (p.returncode, out.splitlines()) def remote_exec_pexpect(hostname, username, password, cmd): -- 1.8.3.1 ----- Original Message -----
Sorry I missed your patch.
The p.returncode can indicate the result of executing command unless you want the standard error. The subprocess.PIPE can ensure the variable out is always string type, but if the stdout is not the subprocess.PIPE, the variable out possibly be the type of None. so I think it is necessary to use the following code if out == None: out = ""
If you want to get standard error in the case of executing command failure. we need to consider other way.
Guannan