繁体   English   中英

Python的os.system命令和重定向

[英]Python's os.system command and redirection

我正在尝试在BASH Shell中进行重定向,尽管这也可以在Windows Command Prompt 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程序的所有结果之后,将打印出打印的行“ fining ping localhost-#”。 这与脚本在外壳中运行且未重定向时的原始程序和输出的逻辑完全不同。

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

您的Python打印语句的输出将被缓冲,并在脚本完成时(或在缓冲区已满时,如果打印文本较多的情况下)写入文件,而外部调用的输出将立即写。 当输出通过管道连接到终端以外的其他端口时,会发生这种情况。

您需要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()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM