如何在python中将os.popen命令更改为子处理命令

时间:2018-11-28 12:27:40

标签: python command subprocess popen deprecated

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

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

1 个答案:

答案 0 :(得分:0)

select name as final_name, last_name as final_last_name, us_address as address, phone_number as phone, car_no from USA union all select name, last_name, india_address, phone_number , null from India 代码将大致等效。

subprocess

输出被捕获到一个变量中,而不是溢出到Python控制之外的标准输出中。如果您只想output = subprocess.check_output( '''sed -n /%s/,/%s/p %s | grep "Invalid Credentials"''' % (st_time, en_time, fileName), shell=True) ,那就继续吧。

如果print未找到任何内容,这将引发异常。如果您想以一种或另一种方式处理这种极端情况,可以用grep对其进行陷印。

但是,您可以轻松地用原生Python代码替换所有这些内容。

except

在这种情况下,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 是一个列表。每个捕获的行仍包含其终止的换行符。 (当然,如果那不是您想要的,易于修复。)

作为一种优化,您可以在看到outputbreak(尽管该脚本与en_time脚本并不完全等效)。

这也应该很容易适应sed不在日志文件中确切出现的情况。您将需要解析每行上的时间戳,然后在解析的日期戳等于(或大于)st_time值时简单地开始处理。同样,解析st_time并在看到带有等于或大于该值的时间戳的日志条目时退出。