如何将 os.popen 命令更改为 python 中的子进程命令

How change a os.popen command to subprocess command in python

我知道 os.popen 现在已弃用。那么这是将 os.popen 命令转换为子进程的最简单方法。

cmd_i = os.popen('''sed -n /%s/,/%s/p %s | grep "Invalid Credentials"''' % (st_time, en_time, fileName))

subprocess 代码大致相同。

output = subprocess.check_output(
    '''sed -n /%s/,/%s/p %s | grep "Invalid Credentials"''' % (st_time, en_time, fileName),
    shell=True)

输出被捕获到一个变量中,而不是溢出到 Python 控制之外的标准输出。如果你只想 print 它,那就去做吧。

如果 grep 没有找到任何东西,这将引发异常。如果您想以一种或另一种方式处理这种极端情况,可以使用 except 来捕获它。

但是,您可以轻松地将所有这些替换为本机 Python 代码。

with open(fileName, 'r') as input:
    between = False
    output = []
    for line in input:
        if st_time in line:
            between = True
        if between and 'Invalid Credentials' in line:
            output.append(line)
        if en_time in line:
            between = False

本例中的output是一个列表。每个捕获的行仍然包含其终止换行符。 (当然,如果这不是您想要的,很容易修复。)

作为优化,当您看到 en_time 时,您可以 break(尽管这样脚本不会完全等同于 sed 脚本)。

这也应该很容易适应 st_time 没有准确出现在日志文件中的场景。您将需要解析每一行的时间戳,然后在解析的日期戳等于或大于(解析的)st_time 值时简单地开始处理。同样,解析 en_time 并在看到时间戳等于或高于此值的日志条目时退出。