2016-09-17 7 views
1

Я пытаюсь прочитать вывод из одной функции в другую.Неполные чтения из файла, написанного подпроцессом Popen()

Если я сломаю вещи на два шага, вызовите первую функцию (journal.py) из командной строки, а затем вызовите вторую (ip_list.py), я получу результаты, которые я ищу.

Если я попытаюсь импортировать первый и запустить его во втором, то получившийся список пуст.

import re 
import journal 

journal.journal() 
ip_list = [] 
with open('Invalid_names_file') as file1: 
    print(file1) 
    a = [re.search(r'((\d+\.)+\d+)', line).group() for line in file1] 
    print(a) 
    for x in a: 
     if x not in ip_list: 
      ip_list.append(x) 

print(ip_list) 

выход ->

<_io.TextIOWrapper name='Invalid_names_file' mode='r' encoding='UTF-8'> 
[] 
[] 

при вызове таким образом, файл, который я открываю это есть (после того, как скрипт выполняется работает), с тем, что я жду, пока я не может заставить его читать его, когда я пытаюсь включить его с импортом.

У меня есть печать(), так что я могу попытаться понять, что происходит, но не может обернуться вокруг него.

journal.py - это команда Popen, которая записывает файл.

редактировать Крису

journal.py

from subprocess import Popen 
import os 

def journal(): 
    with open('Invalid_names_file', 'w') as Invalid_names_file: 
     Popen('journalctl -u sshd.service --no-pager --since -168hours\ 
       --until today | grep Invalid', stdout=Invalid_names_file,\ 
       universal_newlines=True, bufsize=1, shell=True) 
     if os.stat('Invalid_names_file').st_size == 0: 
      Popen('journalctl -u ssh.service --no-pager --since -168hours\ 
        --until today | grep Invalid', stdout=Invalid_names_file,\ 
        universal_newlines=True, bufsize=1, shell=True) 
    Invalid_names_file.close() 
+0

можете ли вы опубликовать фрагмент файла? Мои предположения: 1) 'journal' не закрывает файл 2) ваше регулярное выражение не работает –

+0

regex действительно работает. строка, которая будет считана, будет выглядеть так: «Сен 15 22:00:52 тестирование sshd [4588]: неверный пользователь marilyn с 192.168.122.10 порт 35630« файл, в котором это часть, может быть от нуля до ... много строк long, и регулярное выражение переместит его на один вид каждого IP-адреса. поэтому, если ... 10 отображается 13 раз, он будет добавлен только один раз. – emetib

+0

@ Jean-FrançoisFabre, когда он * выходит *, он обязательно закрывает файл, поэтому, если OP блокирует завершение процесса, там не может быть никакой проблемы. –

ответ

1

Вы должны ждать Popen() закончить. Присвоить возвращаемое значение переменной и вызвать wait() на нем:

p = Popen('journalctl ...') 
p.wait() 

При запуске сценария журнала отдельно, родительский процесс будет возвращать только тогда, когда все его дети прекратили. Однако Popen() не ждет - если вы не скажете об этом. Таким образом, в вашем случае функция journal() выходит сразу после запуска подпроцесса, поэтому к тому моменту, когда вы читаете целевой файл, он по-прежнему пуст или неполный.

+0

спасибо lenz. Я не знал, был ли у меня вопрос гонки с этим или нет. смотрел на io, но это не помогало вообще. – emetib

+0

Я думаю, что документы не очень поучительны в том, как использовать 'Popen()'. Похоже, что они больше поощряют использование функций модуля 'call()' и 'check_output()' и т. Д. – lenz

Смежные вопросы