【问题标题】:Python's os.system command and redirectionPython os.system 命令和重定向
【发布时间】:2016-10-17 08:40:14
【问题描述】:

我正在尝试在 BASH shell 中进行重定向,尽管这也可以在 Windows 命令提示符 shell 中使用 Python 的 os.system 函数。我的问题是我试图将 Python 脚本的输出重定向到文本文件,而 Python 脚本不会因为任何奇怪的语法原因而这样做。所以,我写了一个没有意义的小程序来尝试理解这个问题。以下是我的源代码:

import os

for i in range(10):
    os.system('ping -c 1 localhost')
    print("finishing pinging the localhost - %d" % i)

当我像这样在 shell 中运行它时:$python scriptName.py 程序会打印:

--- localhost ping statistics ---
1 packets transmitted, 1 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 0.080/0.080/0.080/0.000 ms
finishing pinging the localhost - 0
PING localhost (127.0.0.1): 56 data bytes
64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.073 ms

--- localhost ping statistics ---
1 packets transmitted, 1 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 0.073/0.073/0.073/0.000 ms
finishing pinging the localhost - 1
PING localhost (127.0.0.1): 56 data bytes
64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.191 ms

--- localhost ping statistics ---
1 packets transmitted, 1 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 0.191/0.191/0.191/0.000 ms
finishing pinging the localhost - 2
PING localhost (127.0.0.1): 56 data bytes
64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.076 ms

我只显示了上面 BASH shell 的前 3 行输出。但是,当我使用某种类型的重定向运行程序时,我会收到这种不同的输出,从我的角度来看,也有更多不受欢迎的输出。所以如果我像这样运行程序:$python myScript > out.txt。我收到以下输出:

--- localhost ping statistics ---
1 packets transmitted, 1 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 0.076/0.076/0.076/0.000 ms
PING localhost (127.0.0.1): 56 data bytes
64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.077 ms

--- localhost ping statistics ---
1 packets transmitted, 1 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 0.077/0.077/0.077/0.000 ms
PING localhost (127.0.0.1): 56 data bytes
64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.082 ms

--- localhost ping statistics ---
1 packets transmitted, 1 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 0.082/0.082/0.082/0.000 ms
finishing pinging the localhost - 0
finishing pinging the localhost - 1
finishing pinging the localhost - 2
finishing pinging the localhost - 3
finishing pinging the localhost - 4
finishing pinging the localhost - 5
finishing pinging the localhost - 6
finishing pinging the localhost - 7
finishing pinging the localhost - 8
finishing pinging the localhost - 9

我编辑了文件的输出以仅显示底部。底部显示了在ping 程序的所有结果之后打印的行,“finishing ping the localhost - #”。这与原程序的逻辑和脚本在 shell 中运行且未重定向时的输出完全不同。

有谁知道为什么添加重定向时输出不同?

【问题讨论】:

    标签: python bash shell redirect


    【解决方案1】:

    Python print 语句的输出被缓冲,并在脚本完成时写入文件(或者当缓冲区已满时,在打印文本量较大的情况下),而来自外部的输出call 立即被写入。当输出通过管道传输到终端以外的其他东西时,就会发生这种情况。

    你需要flush缓冲区来解决这个问题:

    import os
    
    for i in range(10):
        os.system('ping -c 1 localhost')
        print("finishing pinging the localhost - %d" % i, flush=True)
    

    如果你没有使用 Python >3.3,那么你需要这样做:

    import os
    import sys
    
    for i in range(10):
        os.system('ping -c 1 localhost')
        print("finishing pinging the localhost - %d" % i)
        sys.stdout.flush()
    

    【讨论】:

    • 哇,谢谢安德鲁盖伊的回答。 :) 你知道一些关于 Python 细节的有趣的事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-26
    • 1970-01-01
    • 2012-07-16
    • 1970-01-01
    • 2016-10-18
    • 2018-09-14
    • 1970-01-01
    相关资源
    最近更新 更多