Как изменить команду os.popen на команду подпроцесса в python - PullRequest
0 голосов
/ 28 ноября 2018

Я знаю, что os.popen устарела.Так что это самый простой способ преобразовать команду os.popen в подпроцесс.

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

1 Ответ

0 голосов
/ 03 декабря 2018

Код 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 script).

Это также должно быть легко адаптировано к сценарию, где st_time не встречается точно в файле журнала.Вам нужно будет проанализировать отметку времени в каждой строке, а затем просто начать обработку, когда проанализированная отметка даты равна или больше значения (проанализировано) st_time.Точно так же анализируйте en_time и выходите, когда вы видите записи журнала с отметками времени, равными или превышающими это значение.

...