无法通过stdout的“全局”重定向获取子进程的返回代码到日志文件: F.e:
>>> rc = subprocess.call(['ping', '-c1', 'google.com'])
PING google.com (173.194.69.102) 56(84) bytes of data.
64 bytes from bk-in-f102.1e100.net (173.194.69.102): icmp_seq=1 ttl=46 time=86.1 ms
--- google.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 86.141/86.141/86.141/0.000 ms
>>> rc
0
rc 0 我可以使用它,但是如果这样做:
>>> sys.stdout=open('/var/log/test','a')
>>> rc = subprocess.call(['ping', '-c1', 'google.com'])
PING google.com (173.194.69.102) 56(84) bytes of data.
64 bytes from bk-in-f102.1e100.net (173.194.69.102): icmp_seq=1 ttl=46 time=86.9 ms
--- google.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 86.947/86.947/86.947/0.000 ms
>>> rc
>>> sys.stdout.flash()
1st - rc转到文件,而不再是脚本视图了。所以我无法使用它。
第二 - 仅在sys.stdout.flash()
之后第3次 - ping结果仅在我执行
时进入文件 rc = subprocess.call(['ping', '-c1', 'google.com'],stdout=sys.stdout)
主要问题是如何防止返回代码重定向到stdout文件?
答案 0 :(得分:0)
为什么不直接将ping输出重定向到文件?
rc = subprocess.call(['ping', '-c1', 'google.com'],stdout=open('/var/log/test','a'))
或者将rc写入stderr:
print >> sys.stderr, rc
答案 1 :(得分:0)
为什么不使用commands.getstatusoutput
?
>>> commands.getstatusoutput('ping 8.8.8.8 -c1')
(0, 'PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.\n64 bytes from 8.8.8.8: icmp_req=1 ttl=48 time=29.7 ms\n\n--- 8.8.8.8 ping statistics ---\n1 packets transmitted, 1 received, 0% packet loss, time 0ms\nrtt min/avg/max/mdev = 29.790/29.790/29.790/0.000 ms')
输出是元组status_code/output
。
答案 2 :(得分:0)
在我看来,rc 确实获得了返回值,但由于您已覆盖了进程的标准输出,因此以下行将rc的值写入日志文件:
>>> rc
作为旁注,对于运行子进程,重定向等的脚本,我强烈建议使用plumbum。