2016-09-17 6 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'> 
[] 
[] 

(스크립트 실행이 완료되면), 내가 기대하고있는 무슨과, 아직 내가 거기 가져 오기에 포함 시키려고 할 때 읽을 수 없습니다.

나는 무슨 일이 일어나고 있는지 이해하려고 노력할 수있을 정도로 print()를 가지고 있지만 그 주위에 머리를 들이지 못한다.

journal.py는 파일을 쓰는 Popen 명령입니다. 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)'저널'파일을 닫지 않습니다 2) 당신의 정규식이 작동하지 않습니다 –

+0

정규식이 작동하지 않습니다. 읽을 줄은 다음과 같이 보일 것입니다. 'Sep 15 22:00:52 testing sshd [4588] : 192.168.122.10 포트 35630의 잘못된 사용자 marilyn'이 부분 인 파일은 0부터 ...까지 여러 줄이 될 수 있습니다. 긴, 그리고 정규식은 각 IP 주소의 한 번 발생으로 그것을 내려 놓습니다. 그래서 ... 10이 13 번 나타나면 한 번만 추가 할 수 있습니다. – emetib

+0

@ Jean-FrançoisFabre, * 종료 할 때 * 반드시 파일을 닫습니다. 따라서 OP가 프로세스 완료시 차단되면 거기에는 문제가 없습니다. –

답변

1

당신은 기다려야합니다. 변수에 반환 값을 할당하고 그 위에 wait() 전화 :

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

을 별도로 저널 스크립트를 실행하면, 부모 프로세스는 자식이 모두 종료 된 경우를 반환합니다. 그러나 당신이 말하지 않는 한 Popen()은 기다리지 않습니다. 따라서 하위 프로세스 시작 직후 journal() 함수가 종료되므로 대상 파일을 읽을 때까지 여전히 비어 있거나 불완전합니다.

+0

lenz 감사합니다. 나는 내가 그걸로 경주 문제가 있었는지 여부를 몰랐어요. io를보고 있었지만 전혀 도움이되지 못했습니다. – emetib

+0

나는이 문서가'Popen()'을 사용하는 방법에 대해 매우 유익하지 않다고 생각한다. 그들은'call()'과'check_output()'등등 모듈 함수를 더 많이 사용하도록 장려하고있는 것 같습니다. – lenz