python - 如何将 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))
解决方案
代码将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
同样,当您看到时间戳等于或高于此值的日志条目时,解析并退出。
推荐阅读
- python - 如何将标头附加到由python数据框创建的csv文件中的数据
- python - 如何将倾斜的指纹图像旋转到垂直直立位置
- c# - EventCallback 似乎正在更改剃须刀页面上的参数值
- python - 如何使用python3将docx转换为pdf?
- java - 如何导航到新打开的选项卡?
- c# - 为什么 Unity C# Coroutine 在单击不相关的按钮时执行
- floating-point - math.h sin() 浮点结果与优化定点结果的比较方式
- php - 如何在 XML 中使用 PHP 的大括号 {}?
- r - 从 R 运行互联网速度测试的 Base R(或 CRAN)功能?
- python - 使用 rpy2 改进在 python 函数中调用 R 函数的运行时