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

lujinke 2014-05-27 08:41:32
如:
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
...全文
179 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
panghuhu250 2014-05-28
  • 打赏
  • 举报
回复
默认shell应该是/bin/sh,不支持pipefail.
lujinke 2014-05-28
  • 打赏
  • 举报
回复
在shell控制台上可以设置set -o pipefail 但是这么写确报错: os.system("set -o pipefail;mysqldump -uxx -pxx -S /tmp/mysql.sock test2 >test2.sql") 提示set -o pipefai错误,不知道是不是由于默认shell不是bash导致,但是system函数没有提供指定shell类型的参数 后面根据提示使用subprocess模块 p=subprocess.Popen("mysqldump -uxx -pxx -S /tmp/mysql.sock test2 |gzip2 >test2.sql.gz2",stderr=subprocess.PIPE,executable='/bin/bash',shell=True) p=communicate() print p[1] 在test2不存在的情况下p[1]里面可以获得错误信息,如果命令正常退出p[1]为空字符串 注意上面Popen的shell必须置为True,否则程序会卡住,看文档shell取值True和False,executable参数的含义是不同的
panghuhu250 2014-05-27
  • 打赏
  • 举报
回复
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')。

37,720

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧