首页 > 解决方案 > 如何将 os.popen 命令更改为 python 中的子进程命令

问题描述

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

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

标签: pythoncommandsubprocesspopendeprecated

解决方案


代码将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这种情况下是一个列表。每个捕获的行仍然包含其终止的换行符。(当然,如果这不是您想要的,很容易解决。)

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

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


推荐阅读