Python调用带有重定向命令的可执行程序程序后异常信息丢失

Python调用带有重定向命令的可执行程序程序后错误信息丢失
如:
ret=os.system("mysqldump -uxx -pxx -S /tmp/mysql.sock test2 |gzip2 >test2.sql.gz2")
print ret

如果test2这个数据库不存在,那么mysqldump会失败,但是重定向到gzip2之后,最后的结果却是0
,那么通过判断ret值来看命令是否执行成功就会有问题了,
请问这种问题如何解决?

单独执行:
ret=os.system("mysqldump -uxx -pxx -S /tmp/mysql.sock test2 >test2.sql")
print ret

在test2不存在的情况下,会返回512
------解决方案--------------------
bash支持pipefail选项。例子:

/tmp/ cat xx 
------解决方案--------------------
 gzip > t.gz
cat: xx: No such file or directory

/tmp/ echo $?             # 不会返回cat的error code
0

/tmp/ set -o pipefail

/tmp/ cat xx 
------解决方案--------------------
 gzip > t.gz
cat: xx: No such file or directory

/tmp/ echo $?             # 返回cat的error code
1


你可以把你要执行的命令放到一个bash脚本中,用os.system执行该脚本。如果需要动态生成需要执行的命令,可以用subprocess模块的call函数,call函数有一个executable选项,可以指定要用的shell(例如'/bin/bash')。