【问题标题】:python stdout redirection and returncodepython stdout 重定向和返回码
【发布时间】:2013-02-14 20:51:48
【问题描述】:

无法通过标准输出的“全局”重定向到日志文件获取子进程的返回码: 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

rc0 我可以使用它,但如果这样做:

    >>> 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() 之后

3rd - 仅当我这样做时,ping 结果才会写入文件

 rc = subprocess.call(['ping', '-c1', 'google.com'],stdout=sys.stdout)

主要问题是如何防止返回码重定向到标准输出文件?

【问题讨论】:

    标签: python redirect stdout return-code


    【解决方案1】:

    为什么不使用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】:

    在我看来 rc 确实 得到了返回值,但是由于您已经覆盖了进程的标准输出,因此以下行将 rc 的值写入日志文件:

    >>> rc
    

    附带说明一下,对于运行子进程、重定向等的脚本,我强烈建议使用 plumbum。

    【讨论】:

      【解决方案3】:

      为什么不直接将 ping 的输出重定向到文件?

       rc = subprocess.call(['ping', '-c1', 'google.com'],stdout=open('/var/log/test','a'))
      

      或者改为将rc写入stderr:

      print >> sys.stderr, rc
      

      【讨论】:

      • Bcs 这个例子只是脚本的一部分,有很多我想重定向到日志文件的输出。脚本取决于 ping 的返回码。
      • 无论您将标准输出发送到何处,您都会得到返回码。如果要打印返回码,请使用stderr 示例。或者您是否也在从另一个脚本运行 Python 脚本?
      猜你喜欢
      • 1970-01-01
      • 2014-01-09
      • 2018-01-25
      • 2014-07-22
      • 2020-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-07
      相关资源
      最近更新 更多