【问题标题】:How change a os.popen command to subprocess command in python如何将 os.popen 命令更改为 python 中的子进程命令
【发布时间】:2018-11-28 12:27:40
【问题描述】:

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

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

【问题讨论】:

    标签: python command subprocess popen deprecated


    【解决方案1】:

    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 并在您看到时间戳等于或高于此值的日志条目时退出。

    【讨论】:

    • 好的。谢谢 。在看到这个答案之前,我使用了 subprocess.getoutput() 。是的,我打算使用本机 python 代码。但这需要更多的工作。我在这里给出的代码是以下代码的一小部分:'''sed -n /%s/,/%s/p %s | grep "InvalidCredentials" | cut -d"[" -f 2 | cut -d"," -f1 \ | cut -d"=" -f2 |sort | uniq''' % (st_time, en_time, fileName)
    • 其余部分也不难转换为 Python,但评论不是要求的地方。也许(接受这个答案并)发布一个新问题?
    • 我实际上为你的新问题准备了一个答案,但在我发布之前它被删除了。简而言之,将cut 替换为split() 并将结果收集在dictset 中;那么你不需要单独sort | uniq 任何东西。
    • 感谢您的建议。在 python 中使用 shell 命令可以完成我的工作。所以不急。我打算等有时间的时候再做。
    • 最后一部分可以看stackoverflow.com/a/37858531/874188
    猜你喜欢
    • 2013-02-10
    • 1970-01-01
    • 2021-12-10
    • 2012-03-25
    • 1970-01-01
    • 2020-02-11
    • 2018-12-26
    • 1970-01-01
    • 2023-03-20
    相关资源
    最近更新 更多